关于 x86:QEMU 异常处理

QEMU Exception Handling

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

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

我不明白 QEMU 是如何产生异常的,在调用 ret_protected 方法之后是否还有另一个步骤?


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

我不太清楚你所说的"期望 EIP 不会改变"是什么意思。

如果你能提供更多关于你的问题的细节可能有助于找到正确的答案...