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

3

我正在编写一个跨平台应用程序,可以在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

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

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

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

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

后来编辑以进一步澄清:导致真实硬件出现此问题的指令也在仿真器中执行,在其中似乎可以正常工作而不触发任何异常。


代码是否可能执行垃圾代码?这通常会导致对齐陷阱。因此,QEMU可能很好,但您可能存在时间和/或其他问题,这会导致随机代码在PI上执行。只需编写一个测试用例,查看QEMU如何处理实际的非对齐访问即可。它应该至少记录该事件。 - artless noise
@artlessnoise 相同的代码在真实硬件和模拟的Qemu系统上都被执行。相同的指令在实际硬件上引起异常,但在Qemu中似乎没有任何问题。 - Gavriil Pascalau
@old_timer 我知道Qemu是开源的,因为我也从源代码构建了最新版本(以防旧版本不支持对齐陷阱)。我希望在我深入研究代码之前,有人已经有了解决方案。 - Gavriil Pascalau
1
相关内容,请参见在x86_64 Linux上禁用不对齐的数据修复。我还想看一些跨平台代码中的痛点。到目前为止,我找到的最好的是未定义行为检测器(UBsan)。您可以使用-fsanitize=undefined来启用它。 - jww
1
“…我可以租用ARM服务器,但我想避免这种情况…” - 这是一个自由或开源项目吗?如果是的话,您就有资格获得GCC编译农场账户。它具有x86、ARM、PPC和MIPS机器进行测试。您还可以获得OpenCSW构建农场账户。OpenCSW提供Sparc机器,它们也对齐方式敏感。 - jww
显示剩余2条评论
1个回答

5

QEMU目前不支持模拟ARM客户机代码的非对齐访问陷阱。这反映了其传统主要目的是“尽快运行正确的客户机代码”,因为放置对齐陷阱会减慢正确的客户机代码,并且仅在旧版Arm核心上运行有错误的客户机代码时才会产生影响(自ARMv7及以上硬件版本起,能够正确处理非对齐访问)。

尽管如此,我们现在在通用代码中具有更好的支持,可以发出相对高效的对齐检查;我们只是还没有费心将其连接到Arm代码生成器。如果有人想编写QEMU补丁以添加该支持,我们将接受它们。(大致上,在生成客户机加载和存储时,当客户机CPU处于需要非对齐访问陷阱的状态时,target/arm/translate.c中的代码需要将MO_ALIGN添加到memop标志中;这可能因不同架构版本和不同类型的加载和存储insn而异。)


你好,这个回答已经完成将近3年了,当前状态有更新吗?或者QEMU仍然不支持这个功能吗? - Karrq
3
确实,是的,最近处理对齐故障的方式已经得到了改进。不过,您需要从源代码编译最新版本的QEMU才能尝试它。它应该会在下一个(6.1)版本中发布。 - Peter Maydell
嗨,这个现在的状态是什么? - Emil
我认为这现在已经在上游的QEMU中实现了(尽管可能有一些我们没有检查的边角情况,比如AArch64堆栈对齐陷阱和M-profile MVE对齐检查)。 - Peter Maydell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接