【我所認知的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沿用了同樣的規則。