1

我在测试一些会产生保护错误的代码时遇到了一个错误。我设置了异常处理程序,以便它期望 EIP 和堆栈不会改变,这是本机 CPU 上的标准行为。但是在 QEMU 上,ESP 和 EIP 在故障生成时都发生了变化。

操作系统是 32 位的,因此错误情况与跳出 CS 段有关。深入研究 QEMU 代码,似乎在 helper_ret_protected 中调用 raise_exception_error 之后设置了 EIP 和 ESP。所以,我不明白为什么我在客人身上看到了不同的行为。

我是否不了解 QEMU 如何生成异常,调用 ret_protected 方法后是否还有另一个步骤?

4

1 回答 1

0

出现异常时,CPU 将在跨越特权级别边界时切换堆栈。因此,TSS包含每个级别SSESP条目。如果触发故障的代码恰好在用户模式代码中,则堆栈将被更改。这些SS:ESP值是从TSS的ss0和字段中读取的。ebp0

我几乎不确定您所说的“期望EIP不会改变”是什么意思。

如果您可以提供有关您的问题的更多详细信息可能有助于找到正确的答案...

于 2013-04-14T03:24:03.063 回答