18

我正在开发一个实现一些流密码算法的宠物开源项目,我遇到了一个只有在 ARM 处理器上运行时才会触发的错误。我什至尝试在 qemu 下的 x86 中运行 ARM 二进制文件,但那里没有触发该错误。

该错误的具体机制仍然难以捉摸,但我最好的办法是相信它是由我的程序中未对齐的内存访问尝试引起的,这是由 qemu 实现的,但被我开发板上的真正 ARM 处理器默默地忽略了。

所以,由于这个问题很难诊断,我想知道是否有任何工具可以用来捕获我正在运行的程序进行的未对齐的内存访问,以便我可以准确地看到问题发生在哪里。

如果进程违反内存对齐限制,我还可以使用某种方式在我的 ARM 开发板上启用一些信号(可能是 SIGBUS?),就像我们在访问未映射的内存地址时得到 SIGSEGV 一样。它运行的是 Linux 2.6.32。

4

2 回答 2

20

Linux 可以为您进行修复或警告访问。

您可以在 /proc/cpu/alignment 中启用该行为,有关不同值的说明,请参阅http://www.mjmwired.net/kernel/Documentation/arm/mem_alignment 。

0 - Do nothing (default behavior)
1 - Warning in kernel-log with PC and Memory-Address printed.
2 - Fixup error
3 - Warn and Fixup
4 - Send a SIGBUS to the process
5 - Send SIGBUS and output Warning
于 2013-05-14T17:32:58.623 回答
14

ARM Linux 维护一个对齐处理程序异常列表,

$ cat /proc/cpu/alignment 
User:           0
System:         0
Skipped:        0
Half:           0
Word:           0
DWord:          0
Multi:          0
User faults:    0 (ignored)

它只对procfs有效,但很难想象没有procfs的系统。处理此问题的具体代码位于alignment.c中。您可以使用echo 3 > /proc/cpu/alignmentLinux修复指令并提供一些dmesg输出。通常,通过仿真处理未对齐的访问是非常低效的。最好更正代码。附加调试器的信号选项应该提供一些关于异常来源的线索。

阅读手册。;-)

于 2013-05-14T17:40:10.740 回答