“对齐陷阱”错误消息中的项目有什么含义?

时间:2013-04-10 10:07:52

标签: c linux-kernel arm embedded-linux

在调试期间,我收到以下错误消息。

  

Alignment trap: my_main (29858) PC=0x00170ad8 Instr=0xe5960008 Address=0x00f28daa FSR 0x0f3

我看了一下,发现了很多关于real-time embedded website的信息。 所以现在我知道PCInstr指的是什么,但我仍然没有找到关于AddressFSR部分的任何内容。

什么是FSRAddress指的是什么地址?根据{{​​1}},该地址甚至超出了我的计划范围。有人知道最后两项是什么意思吗?我需要有关这些的信息来解决这种对齐问题。

MAP输出

proc/xxxx/maps

2 个答案:

答案 0 :(得分:16)

PC=0x00170ad8

这告诉您程序计数器的当前值,它可用于确定程序中哪条指令导致陷阱。如果您按照我的想法使用ARM,那么这实际上是当前指令加上8,因此导致陷阱的指令位于0x00170ad0

Instr=0xe5960008

这是错误指令的编码。如果这是在ARM上,那么该指令是ldr r0, [r6, #8]

Address=0x00f28daa

这告诉您程序尝试加载的地址,从而导致错误。假设到目前为止的其他所有内容都是正确的,这是r6 + 8,因此r6在发生错误时保持0x00f28da2

FSR 0xf3

这是故障状态寄存器中保存的值。它告诉你发生了什么错误。此特定值是对齐故障的旧编码(ARMv7之前版本)。

答案 1 :(得分:1)

很可能您的CPU不支持在未对齐的地址处从/向内存读取/写入。如果你正在访问一个4字节的变量,那么显然地址= 0x00f28daa不是4的倍数。只能在任意对齐的地址读/写单个字节。

那篇文章解释得很好。