0

在带有 MPU 的 Cortex-M 处理器上(让我们具体使用 Cortex-M4,但我敢打赌,例如 M3 的答案是相同的),硬件异常条目堆栈在 MPU 中运行的特权模式是什么?

假设我使用进程堆栈 (PSP) 在非特权线程模式下运行,MPU 设置为仅接受特定区域内的写入(例如,用户模式进程正在运行)。当异常发生时,在处理程序执行之前(在处理程序模式下),硬件堆栈寄存器 r0-r3、lr、pc 等到 PSP 上。这是否也发生在非特权线程模式下?

具体来说,假设进程将其 SP 设置为不应写入的内存中的某个任意点,异常堆栈会导致内存故障吗?

4

2 回答 2

0

在处理完这个问题一年后回到这个问题,答案是堆栈发生在之前运行的任何特权下。

因此,如果在非特权模式下发生中断,硬件将使用现有的 MPU 设置在 PSP 上堆叠寄存器,就好像非特权代码正在执行堆叠一样。如果堆叠违反 MPU 规则,则会发生 MemManage 故障,并且将设置 MemManage 故障状态寄存器的 MSTKERR 字段(Cortex-M4 用户指南的第 4-25 页)

于 2017-06-11T03:43:39.623 回答
0

关于MPU规则违例&MSTKERR/MUNSKERR,当非特权软件出现异常,MPU开启时:

  • 在异常条目上,如果为非特权软件分配的堆栈内存的基地址未与其堆栈大小对齐,则 Cortex-M4 生成 MemManage 故障并设置 MSTKERR 字段。

  • 在异常返回时,类似地,如果分配的堆栈内存的基地址未与其堆栈大小对齐,则 Cortex-M4 会生成 MemManage 故障并设置 MUNSKERR 字段。

例如MPU_RASR.SIZE = 0x7表示堆栈的 MPU 区域大小为2^(7+1) = 256 bytes,则MPU_RBAR.ADDR必须为0x00000100, 0x00000200... 等,否则 Cortex-M4 在异常进入/返回时立即生成相应的 MemManage 故障。

有关详细信息,请阅读DUI0553-Cortex™-M4 设备通用用户指南中的第 4.5.4 节MPU 区域基地址寄存器

于 2019-05-14T07:02:49.323 回答