如何模拟ARM未对齐的内存访问异常?

How to emulate ARM unaligned memory access exceptions?

我正在编写一个在 x86 机器上运行的跨平台应用程序,但在实际的 ARM 硬件 (Raspberypi 2) 上 "Bus error" 崩溃 ...

[ 4105.019037] Alignment trap: not handling instruction edd37a00 at [<00014218>]
[ 4105.019059] Unhandled fault: alignment exception (0x001) at 0x0002814e
[ 4105.028227] pgd = b736c000
[ 4105.033347] [0002814e] *pgd=3708d835, *pte=335d075f, *ppte=335d0c7f

...但是 运行 在 Qemu 中没有任何问题。

我运行这个命令在Qemu下运行ning在内核中启用SIGBUS信号和通知,但它似乎没有任何效果:

echo 5 > /proc/cpu/alignment [2]

如何在 Qemu(或其他免费模拟器)中模拟这些错误?我希望能够 运行 在我无法使用实际硬件的 x86 机器上的持续集成环境 运行 中进行自动化测试。或者我可以租用 ARM 服务器,但我想避免这种情况。

稍后编辑以进一步澄清:在真实硬件上导致此问题的指令也在模拟器中执行,它似乎在没有触发任何异常的情况下工作。

QEMU 当前不模拟 ARM 来宾代码的未对齐访问陷阱。这反映出其传统的主要目的是 "run correct guest code as quickly as possible";放置对齐陷阱会减慢正确的来宾代码,并且只会对旧 Arm 内核上的错误来宾代码产生影响 运行(因为 ARMv7 及更高版本在硬件中正确处理未对齐的访问)。

也就是说,我们现在确实在通用代码中提供了更好的支持,以发出相对有效的对齐检查;我们只是还没有费心将它们连接到 Arm codegen。如果有人想编写 QEMU 补丁来添加这种支持,我们会接受他们。 (粗略地说,target/arm/translate.c 中的代码在生成来宾加载和存储时需要将 MO_ALIGN 添加到 memop 标志,当来宾 CPU 处于意味着未对齐访问应该陷入的状态时; 这可能在不同的体系结构版本和不同类型的加载和存储 insn 之间有所不同。)