我在测试一些会产生保护错误的代码时遇到了一个错误。我设置了异常处理程序,以便它期望 EIP 和堆栈不会改变,这是本机 CPU 上的标准行为。但是在 QEMU 上,ESP 和 EIP 在故障生成时都发生了变化。
操作系统是 32 位的,因此错误情况与跳出 CS 段有关。深入研究 QEMU 代码,似乎在 helper_ret_protected 中调用 raise_exception_error 之后设置了 EIP 和 ESP。所以,我不明白为什么我在客人身上看到了不同的行为。
我是否不了解 QEMU 如何生成异常,调用 ret_protected 方法后是否还有另一个步骤?