【发布时间】:2022-12-18 22:15:45
【问题描述】:
MPU in ARM Cortex-M (M0+/M3/M4/M7/etc.) 通常被宣传为允许设置防止取消引用 NULL 指针的保护。但如何在实践中做到这一点? (一些在线讨论,like in the Zephyr Project,表明这个问题不是很微不足道。)
我正在寻找在裸机 ARM Cortex-M 上以“特权模式”运行的最简单的 MPU 代码。请注意,“防止取消引用 NULL 指针”对我来说意味着防止读取和写入。此外,它不仅与地址 0x0 有关,还与它的小偏移量有关。例如,通过 NULL 指针访问结构成员也应该导致 MPU 异常:
struct foo {
. . .
uint8_t x;
};
. . .
uint8_t x = (*(struct foo volatile *)NULL)->x; // should fail!
【问题讨论】:
-
实际上,您展示的是
0的小偏移量的 ax 示例是一个空指针解引用,因为你解引用了空指针第一的在访问x成员之前。 -
另请注意,在许多裸机系统上,地址
0实际上可能是一个完全有效的地址(例如,可能是 RAM 开始的地方)。 -
ARM 内核中的地址 0 可以映射到闪存、RAM 或外部存储器,因此地址 0 非常合适。您需要配置 MPU 以禁止对地址 0 的任何访问/来自地址 0 的任何访问。
-
@Some-programmer-dude:是的,绝对是,地址 0x0 是问题的一部分,也是我问题的很大一部分。在 ARM Cortex-M 中,地址 0x0 是向量表的起始位置。
-
@MiroSamek 可以是也可以不是。向量表地址可设置。根据型号的不同,您甚至可以将其存储在选项字节中并在引导期间加载。