Exception handling QEMU异常处理

Exception handling QEMU异常处理,exception-handling,x86,kernel,qemu,Exception Handling,X86,Kernel,Qemu,我在测试一些可能产生保护故障的代码时遇到错误。我对异常处理程序进行了设置,以使其预期EIP和堆栈不会更改,这是本机CPU上的标准行为。但在QEMU上,ESP和EIP都在故障发生时发生变化 操作系统是32位的,因此错误情况与跳出CS段有关。 深入研究QEMU代码,似乎EIP和ESP是在helper_ret_protected中调用raise_exception_error之后设置的。因此,我无法理解为什么我在客人身上看到了不同的行为 我是否不明白QEMU是如何生成异常的,在调用ret_保护的方法之

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

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


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

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

我不太清楚你期望EIP不会改变是什么意思


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

代码将分配一个大型CS,然后执行Ret,将其置于CS之外。这会触发一般保护故障,因为代码已超过CS限制。在本机CPU中,当触发GPF时,EIP将指向CS中的故障指令。因此,在异常处理程序中,您可以获得错误指令,在QEMU上,EIP在CS之外,并且不指向错误指令。这更清楚吗?@anandb更清楚了。谢谢不管怎样,您选择不使用平线段有什么原因吗?你在裸机上测试过吗?如何调试,特别是检查堆栈?所讨论的ret指令是否与切换到PMode有关?顺便说一句,如果我记得清楚的话,异常堆栈上的EIP不会指向将控件移出CS的ret,而是指向实际的错误地址-即脱离CS的地址,因此除非我误解了你,对我来说,这种行为似乎是正确的。错误地址不是在CS内生成错误的指令之一吗?@anandb我认为它是异常实际发生的地址,即在CS外-这就是异常被触发的原因。如果您可以访问一台带有软盘驱动器和软盘的机器,那么很容易发现:从扁平软盘引导代码并在GPF上打印堆栈。我想它会把地址打印在CS之外。抱歉不能确定,我很久以前做过这些事。。。