我已经加载了一个idt表256项所指类似的处理程序:

  • 例外8和10-14,推例外数量(这些例外推动一个错误代码自动)
  • 其他的人,推动一个"虚拟的"错误代码和例外数量;
  • 然后跳跃到一个共同的处理程序

所以当共同处理程序进入,堆正确地对准,并包含的例外/中断的数量,错误代码(这可能只是一个虚拟的),eflags,cs和eip。

我的问题关于返回中断的处理程序。我用 iret 返回之后采取了例外的数量和错误代码从叠,但是这不适用于例外nr8;如果我离开的错误代码叠,然后返回!

问题:

  • 我必须要离开的错误代码叠的例外情况,把错误代码吗?如果是,怎样 iret 确定它是否具有弹出一个错误代码或没有?
  • 只要我使中断,我总是能得到外8(双重错误),但后一切运行良好(我发展一种业余爱好OS)。这是正常的行为或做我有一个错误的地方吗?
有帮助吗?

解决方案

如果CPU推错误代码自动处理程序 必须 流行之前的 iret.的 iret 指令不知道你来自哪里,如果它是个错误,一个陷阱或外部中断。这总是相同的,并假定没有错误代码。

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

错误代码被推堆 作为一个双字或字(这取决于 默认的中断,陷阱,或任务 栅大小)。保持堆对齐 为推动双字,上一半 错误代码是保留。注意到 错误代码是没出现时 该IRET指令执行 返回的一个例外处理程序,所以 处理程序必须除去的错误代码 在执行之前返回。

你可以找到 32软件开发人员的手册 在这里,: http://www.intel.com/products/processor/manuals/

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

其他提示

我写了一个 小x86OS 一会儿回来。看看文件 isr。asm 在cvs库。

通知我们如何设置的处理程序,大多数推动一个虚拟的双字栈考虑到这些处理程序即自动获得一个错误代码推动。然后当我们回通过iret我们总是可以假设2中的双字在该堆不论的中断和执行一个加esp、8之前iret到干净的东西很好。

应该回答你的第一个问题。

至于你的第二个问题:双重故障时使中断,嗯...可能是一个问题与寻呼如果您没有设置了正确的。可能是一百万其它的事情了:)

我有一个类似的问题与"双重故障"尽快启用的中断。他们 像双故障,但他们真的是定时器中断!

双故障被中断的数量 8.

不幸的是,默认PIC配置的信号定时中断,因为中断数 (DEFAULT_PIC_BASE + TIMER_OFFSET) = (8 + 0) = 8.

屏蔽了我所有的图片中断(直到我准备正确配置PIC)沉默这些双故障类似计时中断。

(照片要求的CPU承认中断之前他们生产的下一个。因为你的代码不是承认初始时中断,PIC从来没有给你任何更多!这就是为什么你只有一个,而不是数不胜数的一个可能具有的预期。)

我必须要离开的错误代码叠的例外情况,把错误代码吗?

正如其他人所提到的,你已经做到:

pop %eax
/* Do something with %eax */
iret

或者如果你想忽略的错误代码:

add $4, %esp
iret

如果你不要, iret 将解释,错误代码作为新的CS,你都有可能获得一般保护错误作为所提到的在于: 为什么iret从页故障的处理程序产生的中断13(一般保护故障)和错误代码0x18?

最小的工作,该网页的处理程序 我已经创建以说明。尝试评论了 pop 看看它炸毁。

比较上一个 分的错误异常 这并不流行。

注意到如果你这样做只是 int $14, ,没有多余的字节被推:这只是发生的实际例外。

英特尔手册》第3卷的系统编程指南-325384-056US2015年九月 表6-1."保护模式的例外情况中断"栏中的"错误代码"包含在名单中断,推错误代码或没有。

38.9.2.2"页错误代码"解释什么是错误的手段。

一个简洁的方式来处理,这是推动一个虚拟的错误代码 0 在堆的中断,不这样做使事情均匀。詹姆斯*莫罗伊的教程 正是这么做的.

Linux内核4.2似乎做类似的东西。下 拱/x86/entry/entry64.S 它的型号中断 has_error_code:

trace_idtentry page_fault do_page_fault has_error_code=1

然后用它在同一文件为:

.ifeq \has_error_code
pushq $-1 /* ORIG_RAX: no syscall to restart */
.endif

这并推的时候 has_error_code=0.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top