我加载了一个包含 256 个条目的 idt 表,所有条目都指向类似的处理程序:
- 对于异常 8 和 10-14,推送异常编号(这些异常会自动推送错误代码)
- 对于其他人,推送“虚拟”错误代码和异常编号;
- 然后跳转到一个公共处理程序
因此,当公共处理程序进入时,堆栈会正确对齐并包含异常/中断号、错误代码(可能只是一个虚拟代码)、eflags、cs 和 eip。
我的问题是关于从中断处理程序返回的。我用iret
从堆栈中取出异常号和错误代码后返回,但这不适用于异常nr 8;如果我将错误代码留在堆栈上,那么它会正常返回!
问题:
- 对于将错误代码放在那里的异常,我是否必须将错误代码留在堆栈上?如果是这样,如何
iret
确定是否必须弹出错误代码?
- 一旦我启用中断,我总是会收到异常 8(双重错误),但随后一切都运行良好(我正在开发一个业余爱好操作系统)。这是正常行为还是我在某个地方有错误?
如果 CPU 自动推送错误代码,则处理程序must在之前弹出它iret
. The iret
指令不知道你来自哪里,是错误、陷阱还是外部中断。它总是做同样的事情,并且假设堆栈上没有错误代码。
引用 SDM(软件开发人员手册)第 3 卷第 5 章第 5.13 节,标题为“错误代码”:
将错误代码压入堆栈
作为双字或字(取决于
默认中断、陷阱或任务
浇口尺寸)。保持堆栈对齐
对于双字推送,上半部分
错误代码的保留。笔记
错误代码不会弹出
IRET指令被执行到
从异常处理程序返回,所以
处理程序必须删除错误代码
在执行返回之前。
您可以找到IA-32 软件开发人员手册 http://www.intel.com/products/processor/manuals/ here http://www.intel.com/products/processor/manuals/: http://www.intel.com/products/processor/manuals/ http://www.intel.com/products/processor/manuals/
第 3 卷第 1 部分第 5 章描述了异常和中断处理。第 2 卷第 1 部分的规格iret
操作说明。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)