【我所认知的BIOS】->深入理解IRQ7
by lightseed
12/13/2010
这篇文章的线索是因为偶然间发现自爱DOS下面,IRQ7对应的中断服务程序(ISR)只有一个Iret.那我不经会问,这是为什么呢?因为在BIOS下面IRQ7是有对应的ISR的。
这个问题归根结底是由于8259的中断产生机制造成。
简单回顾一下8259中断的产生过程。共分了6步:
1. 一个或者多个中断请求产生的时候,8259把对应的IRR(interrupt request register)置起来。
2. 8259评估这些中断请求,如果是可以的话,发送INT信号给CPU。
3. CPU收到INT后,回发INTA#给8259。
4. 在接收从CPU发来的INTA#的过程中优先级最高的IRR会被填入到ISR中去。同时IRR的对应位被8259清掉。(不过这这个INTA#的过程汇总,8259并不会把数据放到DATA bus上去。)
5. CPU触发第二个INTA#,在这个过程中,8259把数据放到data bus上去,CPU同时从bus上读取数据。
6. 数据传输完成,CPU解析数据并进入到对应的interrupt service routing处理,最后发EOI(end of interrupt)给8259。8259于是清掉ISR。
整个中断过程结束。
根据8259 datasheet的说明,有这样一种可能性。在第③步发生了一种特殊情况,从第③到第④步的时候,并没有interrupt request了。(比如说中断请求太短),这样的话两片8259均会把中断7填到data bus上去。看上去就想是触发了IRQ 7了一样。
我想也正是这个原因,BIOS和DOS都对IRQ 7对应的ISR做了特殊的处理。比如说,BIOS的里面的IRQ7对应的ISR什么动作都没做。DOS下IRQ7对应的ISR被直接替换成了IRET.
不过上面都只是我对8259 datasheet的研究的时候发现的,也纯粹是理论上的理解。真实原因也许不是这样个原因。
以上整个过程在后续的ICH和最新的南桥spec沿用了同样的规则。