我必须要出错误代码推堆的某些例外情况之前返回中断处理程序?
-
20-08-2019 - |
题
我已经加载了一个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
指令。
其他提示
我有一个类似的问题与"双重故障"尽快启用的中断。他们 看 像双故障,但他们真的是定时器中断!
双故障被中断的数量 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
.