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

时间:2016-07-18 15:31:31

标签: assembly arm abort

我正在研究设置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

1 个答案:

答案 0 :(得分:3)

实际上回答这个问题需要复制十几页the ARMv7-A Architecture Reference Manual,所以请考虑更多的一系列指示研究内容的路标; ARMv7-A上的系统级编程涉及到在没有适当的参考资料的情况下会很痛苦,特别是如果您将架构版本与更旧更简单的ARM7内核(ARMv4架构)混淆。 / p>

自ARMv6以来,FSR现在是DFSRFormerly),正如它在锡上所说的那样告诉你数据故障的状态(指令故障有一个单独的IFSR)。如果中止是同步的,DFAR(LyFinalCode)也会告诉你错误地址。

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

*当然假设我们不是在谈论对Hyp模式采取例外,因为Hyp模式完全是一个不同的鱼类。