我正在使用 MPU 授予对特定内存区域的访问权限。 (目标是微控制器+zephyr-rtos,rust编译为静态库)。应用程序因 MPU 故障而崩溃。我跟踪了它尝试访问的全局变量,这些全局变量被放入合并的内存区域中,这些区域位于被授予访问权限的内存之外。请参阅地图文件中的以下片段:
.bss..L_MergedGlobals.510
0x0000000020425038 0x60 /home/marius/...
...
.data..L_MergedGlobals
0x0000000020456d54 0x8 /home/marius/...
我找不到有关这些合并全局变量的太多信息,仅在 llvm 文档中提到了一点
全局变量可以用unnamed_addr来标记,它然而,该地址对我来说很重要。表示地址不重要,只有内容。如果这样标记的常量具有相同的初始值设定项,则可以与其他常量合并。请注意,具有有效地址的常量可以与 unnamed_addr 常量合并,结果是地址有效的常量。
所以我的问题是:
#[link_section=stringify!(some_region)]
我查看了 Rust 的拆解,看到了一堆这样的行:
...$core..ops..deref..Deref$GT$5deref11__stability4LAZY..., .L_MergedGlobals+16
所以我查看了我取消引用事物的地方。事实证明,我尝试访问的对象位于可访问区域内,但对该对象的引用也是全局的,并且未授予对该对象的访问权限。该引用是 &'static 引用。更改代码以使引用不是静态后,MergedGlobals 消失了。似乎 &'static 引用被编译器标记为 unnamed_addr,因此它们位于 MergedGlobals 区域中