我正在编写一个可在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服务器,但我想避免这种情况。
稍后进行编辑以进一步说明问题:在实际硬件上导致此问题的指令也在模拟器中执行,该模拟器似乎在工作时不会触发任何异常。
答案 0 :(得分:2)
QEMU当前不为ARM来宾代码模拟未对齐的访问陷阱。这反映了一个事实,即其传统的主要目的是“尽快运行正确的来宾代码”;放入对齐陷阱会减慢正确的来宾代码的速度,并且只会对在较旧的Arm内核上运行的有问题的来宾代码有所不同(因为ARMv7及更高版本可以在硬件中正确处理未对齐的访问)。
也就是说,我们今天在通用代码中确实提供了更好的支持,以发出相对有效的对齐检查;我们只是没有费心将它们连接到Arm codegen。如果有人想编写QEMU补丁以添加该支持,我们将接受它们。 (大致来说,target / arm / translate.c中的代码在生成来宾负载时需要在注释标记中添加MO_ALIGN,并在来宾CPU处于状态时表示应捕获未对齐访问的状态时进行存储;这在不同的体系结构版本之间可能有所不同以及用于不同类型的加载和存储insn。)