加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

程序集 – 在从中断处理程序返回之前,是否必须弹出由某些异常推

发布时间:2020-12-14 23:34:48 所属栏目:Java 来源:网络整理
导读:我已经加载了一个包含256个条目的idt表,它们都指向类似的处理程序: 对于例外8和10-14,推送例外号码(这些例外会自动推送错误代码) 对于其他人,推送“虚拟”错误代码和异常编号; 然后跳转到一个公共处理程序 因此,当公共处理程序进入时,堆栈正确对齐并包含异
我已经加载了一个包含256个条目的idt表,它们都指向类似的处理程序:

>对于例外8和10-14,推送例外号码(这些例外会自动推送错误代码)
>对于其他人,推送“虚拟”错误代码和异常编号;
>然后跳转到一个公共处理程序

因此,当公共处理程序进入时,堆栈正确对齐并包含异常/中断号,错误代码(可能只是虚拟代码),eflags,cs和eip.

我的问题是关于从中断处理程序返回.我从堆栈中取出异常编号和错误代码后使用iret返回,但这对异常nr 8不起作用;如果我把错误代码留在堆栈上,那么它返回正常!

问题:

>我是否必须将错误代码留在堆栈上,以查找将错误代码放在那里的异常?如果是这样,iret如何确定是否必须弹出错误代码?
>一旦我启用中断,我总是得到异常8(双重故障),但一切都运行正常(我正在开发一个爱好操作系统).这是正常行为还是某处有错误?

解决方法

如果CPU自动推送错误代码,则处理程序必须在iret之前弹出它.如果是故障,陷阱或外部中断,iret指令不知道你来自哪里.它总是一样,并假设堆栈上没有错误代码.

引自SDM(软件开发人员手册),第3卷,第5章,第5.13节标题为错误代码:

The error code is pushed on the stack
as a doubleword or word (depending on
the default interrupt,trap,or task
gate size). To keep the stack aligned
for doubleword pushes,the upper half
of the error code is reserved. Note
that the error code is not popped when
the IRET instruction is executed to
return from an exception handler,so
the handler must remove the error code
before executing a return.

你可以找到IA-32 Software Developer’s Manual here:http://www.intel.com/products/processor/manuals/

第3卷第1部分,第5章描述了异常和中断处理.第2卷第1部分有iret指令的规范.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读