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

Gav*_*lau 3 linux arm qemu memory-alignment

我正在编写一个跨平台应用程序,该应用程序可在 x86 机器上运行,但在实际 ARM 硬件(Raspberypi 2)上因“总线错误”而崩溃...

[ 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Pet*_*ell 5

QEMU 目前不模拟 ARM 来宾代码的未对齐访问陷阱。这反映了这样一个事实:其传统的主要目的是“尽快运行正确的来宾代码”;放入对齐陷阱会减慢正确的来宾代码的速度,并且只会对旧版 Arm 内核上运行的有缺陷的来宾代码产生影响(因为 ARMv7 及更高版本在硬件中正确处理未对齐的访问)。

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

  • 碰巧的是,对齐错误的处理最近已经得到了改进。不过,您需要从源代码编译 head-of-git QEMU 才能进行尝试。它应该在下一个(6.1)版本中。 (3认同)