lve*_*lla 16 c linux arm memory-alignment
我正在开发一个宠物开源项目,它实现了一些流密码算法,我遇到的问题只有在我在ARM处理器上运行时才会触发.我甚至尝试在qemu下运行x86中的ARM二进制文件,但是那里没有触发bug.
这个bug的具体机制仍然是难以捉摸的,但我最好的办法是相信它是由我的程序中未对齐的内存访问尝试引起的,这是由qemu实现的,但是我的开发板中真正的ARM处理器默默地忽略了它.
因此,由于问题显示非常难以诊断,我想知道是否有任何工具可用于捕获我运行的程序所做的未对齐内存访问,以便我可以确切地看到问题发生的位置.
我还可以使用某种方式在我的ARM开发板上启用一些信号(SIGBUS,可能?),如果进程违反了内存对齐限制,就像我们在访问未映射的内存地址时得到SIGSEGV一样.它运行的是Linux 2.6.32.
Nic*_*rth 15
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
Run Code Online (Sandbox Code Playgroud)
art*_*ise 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)
Run Code Online (Sandbox Code Playgroud)
它只对procfs有效,但很难想象没有procfs的系统.处理它的具体代码在alignment.c中.您可以使用echo 3 > /proc/cpu/alignment
Linux fixup指令并提供一些dmesg
输出.通常,通过仿真处理未对齐的访问非常低效.最好纠正代码.附加调试器的信号选项应该提供一些关于异常源的线索.
阅读手册.;-)