我正在尝试根据此 reference manual 的第 146 页使用 STM32(l412kb) 的防火墙.我知道要初始化防火墙,您需要设置基地址和要保护的段的长度。然后通过清除 SYSCFG 寄存器中的 FWDIS(禁用防火墙)位来启用防火墙。
但是我不明白如何打开防火墙来执行代码。据我了解,代码段的前三个 32 位地址处有三个字。第一个词是一个虚拟词。第二个和第三个字是两个特定的 32 位字,称为“调用门”。
我的问题是:
这 3 个词是在什么时候创建的?
我需要输入一些额外的代码来打开大门吗?
这两个叫门词是什么?
引用手册提到虚拟词被跳过到第 2 个和第 3 个词。我如何确保发生这种情况?
- 要保护 SRAM,必须知道要保护的内存位置的地址。我如何知道我要保护的数据将保存在 RAM 中的哪个位置?
或者这些都是自动硬件操作。
非常感谢您的帮助,
哈利
最佳答案
- At what point were these 3 words created?
它们由编译器和链接器创建,并写入片上闪存。
- Do i need to put in some extra code to open the gate?
没有。跳转到第二个字会打开防火墙。
- What are these two call-gate words?
Thumb(-2) 机器代码指令位于 protected 函数的开头。它们必须按顺序取,也就是说第二个字不能有分支指令。
我只是用 4 个 NOP
指令填充第一个和第二个单词,然后直接将 protected 函数放在后面。
- The reference manual mentions that the dummy word is skipped to the 2nd and 3rd words. How do I ensure this happens?
仔细编写您的代码,使其永远不会尝试执行或读取第一个单词。
- To protect the SRAM, the address of the memory location to protect must be known. How do I know where in RAM the data I want to protect will be held?
在链接器定义文件中定义一个单独的部分(.ld
、.sct
或 .icf
,取决于所使用的链接器)以将 protected 变量放入,根据防火墙要求对齐,然后在该部分的开头和结尾导出一个符号,就像在 .data
, .bss 中所做的那样
和 .heap
部分。
关于c - 需要帮助了解 STM32 防火墙的 "Call Gate"序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57692815/