我正在研究设置ARM MMU的代码。我使用快速模型。
我在VTTBR寄存器中放了一些虚拟值,我得到了数据中止。
我看过这篇文章How to handle this Data Abort exception in ARM 7? mode in CPSR 0x17 and board stucked at 0x10,我试着查看链接寄存器。
从那里我发现中止发生在这条指令上:MOVT r3,#0x8400
。
但在此之前已经发生了像MOV r3,#0x9240
这样的举动。我对第二步的问题感到非常困惑。我想确切地知道在可能的四种类型中发生了哪种类型的数据中止(1.对齐故障2.翻译故障3.域故障4.许可故障。)。
我的代码就像这样
840000A4 : MOV r3,#0x9240
840000A8 : MOVT r3,#0x8400
我知道MOVT会将值移到上半部分(上半部分)而不影响下半部分字。
我的LR
包含840000A8
。
答案 0 :(得分:3)
实际上回答这个问题需要复制十几页the ARMv7-A Architecture Reference Manual,所以请考虑更多的一系列指示研究内容的路标; ARMv7-A上的系统级编程涉及到在没有适当的参考资料的情况下会很痛苦,特别是如果您将架构版本与更旧更简单的ARM7内核(ARMv4架构)混淆。 / p>
自ARMv6以来,FSR现在是DFSR(Formerly
),正如它在锡上所说的那样告诉你数据故障的状态(指令故障有一个单独的IFSR)。如果中止是同步的,DFAR(LyFinalCode
)也会告诉你错误地址。
此外,数据中止的链接寄存器 * 值是故障指令的8 bytes ahead(尽管请注意,与正常PC行为不同,总是 8个字节,无论指令集如何),所以如果你的LR包含0x840000a8,你需要查看0x840000a0的罪魁祸首。
*当然假设我们不是在谈论对Hyp模式采取例外,因为Hyp模式完全是一个不同的鱼类。