如何在 ARM v7 中找到数据中止的类型?

How to find the type of data abort in ARM v7?

我正在编写代码来设置 ARM MMU。我使用快速模型工作。 我在 VTTBR 寄存器中放入了一些虚拟值,结果数据中止。 我已经看到了这个 post How to handle this Data Abort exception in ARM 7? mode in CPSR 0x17 and board stucked at 0x10 并且我试图查看 link 寄存器。 从那里我发现中止发生在这条指令上:MOVT r3,#0x8400.

但在此之前已经发生了像MOV r3,#0x9240这样的举动。我对第二步出了什么问题感到很困惑。我想确切地知道四种可能类型中发生了哪种类型的数据中止(1.alignment 故障 2.translation 故障 3.domain 故障 4.permission 故障。)。

我的代码是这样的

840000A4 : MOV r3,#0x9240  
840000A8 : MOVT r3,#0x8400  

我知道 MOVT 将值移入上(上)半字而不影响下半字。

我的 LR 包含 840000A8

实际上回答这个问题需要复制十几页或更多页的 the ARMv7-A Architecture Reference Manual,因此请将其更多地视为一组指向研究内容的路标; ARMv7-A 上的系统级编程涉及到如果没有适当的参考 material 将会很痛苦的程度,特别是如果您将架构版本与更旧和更简单的 ARM7 内核(ARMv4 架构)混淆。

从 ARMv6 开始,FSR 现在是 DFSRmrc p15, 0, <Rt>, c5, c0, 0),正如锡罐上所说,它告诉您数据错误的状态(指令错误有一个单独的 IFSR ).如果中止是同步的,DFAR (mrc p15, 0, <Rt>, c6, c0, 0) 也会告诉您故障地址。

此外,数据中止的 link 寄存器 * 值是错误指令的 8 bytes ahead(尽管请注意,与正常的 PC 行为不同,它总是 8 个字节,无论指令集如何),所以如果你的 LR 包含 0x840000a8,你需要查看 0x840000a0 来寻找罪魁祸首。

* 当然假设我们不是在谈论对 Hyp 模式采取例外,因为 Hyp 模式完全是另一回事。