我正在开发一个实现一些流密码算法的宠物开源项目,我遇到的问题只有在我在ARM处理器上运行时才会触发。我甚至尝试在qemu下运行x86中的ARM二进制文件,但是那里没有触发bug。
该bug的具体机制仍然难以捉摸,但我最好的办法是相信它是由我的程序中未对齐的内存访问尝试引起的,这是由qemu实现的,但在我的开发中被真正的ARM处理器默默忽略板。
所以,既然问题显示很难诊断,我想知道是否有任何工具可以用来捕获我运行程序所做的未对齐内存访问,这样我就可以看到问题发生了。
我还可以使用某种方式在我的ARM开发板上启用一些信号(SIGBUS,可能?),如果进程违反了内存对齐限制,就像我们在访问未映射的内存地址时得到SIGSEGV一样。它运行的是Linux 2.6.32。
答案 0 :(得分:14)
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
答案 1 :(得分:12)
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/alignment
使Linux fixup 指令并提供一些dmesg
输出。通常,通过仿真处理未对齐的访问非常低效。最好纠正代码。带有调试器的 signal 选项应该提供一些关于异常来源的线索。
阅读manual。 ; - )