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

标签 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

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

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

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

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

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

最佳答案

QEMU 当前不模拟 ARM 访客代码的未对齐访问陷阱。这反射(reflect)了一个事实,即其传统的主要目的是“尽快运行正确的客户代码”;放置对齐陷阱会减慢正确的 guest 代码的速度,并且只会对在较旧的 Arm 内核上运行的错误 guest 代码产生影响(因为 ARMv7 及更高版本可以在硬件中正确处理未对齐的访问)。

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

关于linux - 如何模拟ARM未对齐的内存访问异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51520635/

相关文章:

linux - 如何知道gcc安装的确切位置

linux - 如何在基于内核 2.6.38 和 initd 的系统中启用 Linux 命名空间?

linux - Bash:从 ./将所有目录的内容移动到各自的 ../

linux - 如何将 Dcmtk 与 Qt for Linux 正确链接?

android - 为 Android 生成共享库

assembly - 了解 ARM7 上的 MRC

qemu - 谁在 qemu-riscv 中提供系统调用?

c - 当与 ARM 目标上的数字文字结合时,Clang 是否将短裤提升为整数?

linux - QEMU arm永久存储

linux-device-driver - 在 Qemu 上编写用于 DMA 传输的 PCI 驱动程序