linux 如何捕获未对齐的内存访问?

x4shl7ld  于 12个月前  发布在  Linux
关注(0)|答案(2)|浏览(101)

我正在做一个宠物开源项目,它实现了一些流密码算法,我遇到了一个bug,只有当我在ARM处理器上运行它时才会触发。我甚至尝试在qemu下运行x86中的ARM二进制文件,但这个bug没有被触发。
该错误的具体机制仍然难以捉摸,但我最好的办法是相信它是由我的程序中的未对齐内存访问尝试引起的,这是由qemu完成的,但我的开发板中的真实的ARM处理器默默地忽略了它。
因此,由于这个问题很难诊断,我想知道是否有任何工具可以用来捕获运行程序进行的未对齐内存访问,以便我可以确切地看到问题发生的位置。
我也可以在我的ARM开发板上使用某种方法,在进程违反内存对齐限制时发出一些信号(SIGBUS,也许?),比如当访问未Map的内存地址时,我们会得到SIGSEGV。它运行的是Linux 2.6.32。

0sgqnhkj

0sgqnhkj1#

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

字符串

cbwuti44

cbwuti442#

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输出。通常,通过模拟处理非对齐访问是非常低效的。最好是纠正代码。* 信号 * 附加了调试器的选项应该给予一些关于异常来源的线索。
阅读manual. ;-)

相关问题