我已经加载了一个包含256个条目的idt表,它们都指向类似的处理程序:
对于例外8和10-14,推送异常编号(这些异常会自动推送错误代码)
对于其他人,推送"虚拟"错误代码和异常号码;
然后跳转到一个公共处理程序
因此,当公共处理程序进入时,堆栈正确对齐并包含异常/中断号,错误代码(可能只是虚拟代码),eflags,cs和eip.
我的问题是关于从中断处理程序返回.我iret
从堆栈中取出异常编号和错误代码后使用返回,但这不适用于异常nr 8; 如果我把错误代码留在堆栈上,那么它返回正常!
问题:
我是否必须将错误代码留在堆栈上,以便将错误代码放在那里?如果是这样,如何iret
确定是否必须弹出错误代码?
一旦我启用中断,我总是得到异常8(双故障),但一切都运行正常(我正在开发一个爱好操作系统).这是正常行为还是某处有错误?
Nathan Fellm.. 13
如果CPU自动推送错误代码,则处理程序必须在之前弹出错误代码iret
.该iret
指令不知道您来自何处,是故障,陷阱还是外部中断.它总是一样,并假设堆栈上没有错误代码.
引自SDM(软件开发人员手册),第3卷,第5章,第5.13节标题为错误代码:
错误代码作为双字或字被压入堆栈(取决于默认中断,陷阱或任务门大小).为了保持堆栈对齐双字推送,错误代码的上半部分是保留的.请注意,执行IRET指令以从异常处理程序返回时,不会弹出错误代码,因此处理程序必须在执行返回之前删除错误代码.
您可以在此处找到IA-32软件开发人员手册 :http://www.intel.com/products/processor/manuals/
第3卷第1部分,第5章描述了异常和中断处理.第2卷第1部分有iret
指令的规范.
如果CPU自动推送错误代码,则处理程序必须在之前弹出错误代码iret
.该iret
指令不知道您来自何处,是故障,陷阱还是外部中断.它总是一样,并假设堆栈上没有错误代码.
引自SDM(软件开发人员手册),第3卷,第5章,第5.13节标题为错误代码:
错误代码作为双字或字被压入堆栈(取决于默认中断,陷阱或任务门大小).为了保持堆栈对齐双字推送,错误代码的上半部分是保留的.请注意,执行IRET指令以从异常处理程序返回时,不会弹出错误代码,因此处理程序必须在执行返回之前删除错误代码.
您可以在此处找到IA-32软件开发人员手册 :http://www.intel.com/products/processor/manuals/
第3卷第1部分,第5章描述了异常和中断处理.第2卷第1部分有iret
指令的规范.