首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在从中断处理程序返回之前,我必须弹出由某些异常推送到堆栈的错误代码吗?

在从中断处理程序返回之前,我必须弹出由某些异常推送到堆栈的错误代码吗?
EN

Stack Overflow用户
提问于 2009-01-29 13:38:23
回答 4查看 4.8K关注 0票数 6

我已经加载了一个包含256个条目的idt表,所有条目都指向类似的处理程序:

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

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

我的问题是从中断处理程序返回。在从堆栈中取出异常号和错误代码后,我使用iret返回,但是这对异常nr 8无效;如果我将错误代码留在堆栈中,那么它返回的很好!

问题:

  • 如果存在错误代码的异常,是否必须将错误代码保留在堆栈中?如果是这样的话,iret如何确定它是否必须弹出错误代码?
  • 一旦我启用中断,我总是得到异常8(双故障),但一切运行良好(我正在开发一个业余操作系统)。这是正常的行为还是我在某个地方有窃听器?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-01-29 13:50:57

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

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

将错误代码作为双字或双字推送到堆栈上(取决于默认的中断、陷阱或任务门大小)。为了保持堆栈对齐以进行双字推送,将保留错误代码的上半部分。注意,在执行IRET指令从异常处理程序返回时不会弹出错误代码,因此处理程序在执行返回之前必须删除错误代码。

您可以找到IA-32软件开发人员手册 这里http://www.intel.com/products/processor/manuals/

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

票数 13
EN

Stack Overflow用户

发布于 2009-01-29 14:02:10

我写了一段时间的小型x86操作系统。查看cvs存储库中的文件isr.asm

请注意我们是如何设置处理程序的,大多数情况下都会将一个虚拟dword推到堆栈上,以说明少数几个自动推送错误代码的处理程序。然后,当我们通过一个iret返回时,我们总是可以假设堆栈上有两个dword,而不管中断是什么,并且在iret之前执行一个add esp,8来很好地清理事情。

回答你的第一个问题。

至于第二个问题:启用中断时出现双重故障,如果没有正确设置分页,...hmmm可能会出现问题。也可能是另外一百万件事:)

票数 1
EN

Stack Overflow用户

发布于 2015-01-25 19:53:26

当我启用中断时,我在“双故障”方面也遇到了类似的问题。嗯,他们看起来像双重错误,但他们真的是计时器中断!

双故障是中断号8

不幸的是,默认的PIC配置会以中断号(DEFAULT_PIC_BASE + TIMER_OFFSET) = (8 + 0) = 8中断计时器。

屏蔽我的所有PIC中断(直到我准备好正确配置PIC),沉默这些双故障相似的定时器中断。

(图片要求CPU在产生下一个中断之前确认中断。由于您的代码没有确认最初的计时器中断,PIC再也没有给您提供任何!这就是为什么你只有一个,而不是一个人可能期望的万万)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/491613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档