关于《一个操作系统的实现》里面一个可屏蔽中断的问题
书中说:
外部可屏蔽中断的发生就受到两个因素的影响,只有当IF位为 1 ,并且 IMR 相应位为 0 时才会发生。
然后,书中的实现分别通过写入 ICW 1 来打开相应的 IMR 以及 sti 来使 IF 位为 1 ,打开了时钟中断。
我的问题就出现在书中的时钟中断程序 ClockHandler :
inc byte [gs:((80*0+70)*2)]
mov al, 20h
out 20h, al
iretd
我的问题是: 为什么时钟中断能够一直发生?
ired
是什么作用 ? 为什么我去掉了后面的
jmp $
出现了下面的问题
>>PANIC<< master: ICW1: single mode not supported
`
Answers
我给你解答一下iretd的作用,和iret是一样的,表示中断返回。类似函数调用时的return。
网上的详细解答:
iretd
当一个中断服务程序执行完毕时,CPU将恢复被中断的现场,返回到引起中断的程序中。为了实现此项功能,指令系统提供了一条专用的中断返回指令。
该指令执行的过程基本上是INT指令的逆过程,具体如下:
◆、从栈顶弹出内容送入IP;
◆、再从新栈顶弹出内容送入CS;
◆、再从新栈顶弹出内容送入标志寄存器;
对80386及其以后的CPU,指令IRETD从栈顶弹出32位内容送入EIP。
中断和子程序调用之间有其相似和不同之处。它们的工作过程非常相似,即:暂停当前程序的执行,转而执行另一程序段,当该程序段执行完时,CPU都自动恢复原程序的执行。
它们的主要差异有:
◆、子程序调用一定是程序员在编写源程序时事先安排好的,是可知的,而中断是由中断源根据自身的需要产生的,是不可预见的(用指令INT引起的中断除外);
◆、子程序调用是用CALL指令来实现的,但没有调用中断的指令,只有发出中断请求的事件(指令INT是发出内部中断信号,而不要理解为调用中断服务程序);
◆、子程序的返回指令是RET,而中断服务程序的返回指令是IRET/IRETD。
◆、在通常情况下,子程序是由应用系统的开发者编写的,而中断服务程序是由系统软件设计者编写的。