現在我們已經認識到,在pc的設計中,cpu並不是完全按照程式指令一條一條執行,有時候人為或者隨機的觸發裝置中斷,可以讓cpu去執行相應的中斷處理常式,以打造一個更加智能的軟硬體系統。那麼頂級的電腦設計師們又設計了怎樣的中斷處理系統了來實現這種需求呢,我們試著去解讀這一切。
中斷控制器的串連
首先我們來看看需求。對於裝置來說,最簡單的設計就是我對外提供一個引腳,如果是高電平就說明我申請中斷,如果低電平就說明沒有插斷要求。關鍵是這個引腳訊號如何主動的傳給cpu呢?因為以前都是有cpu指令集去讀io空間擷取這些引腳訊號,現在在沒有指令的情況下,裝置主動將引腳中斷訊號穿越外設與cpu之間隔著的很多橋和匯流排最後通知到cpu,這是問題之一。另外,我們可能有很多裝置都需要有中斷引腳,如鍵盤,滑鼠,定時器等。這些引腳訊號如果都與cpu串連是不現實的,這樣嚴重影響了cpu的相容性,通用性和簡潔性,如果不這麼做,那麼cpu收到引腳中斷訊號後,又怎麼知道是誰發過來的插斷要求呢,這是問題之二。
問題看起來很複雜,但是只要大家齊心協力,沒有什麼事情是不能解決的。首先,很自然的想法是引入一個中斷控制器,這個中斷控制器最好就在南橋上,因為需要插斷要求的一般都是南橋上的io裝置。這個中斷控制器需要有很多中斷訊號引腳分別串連io裝置的插斷要求訊號線,這樣外部裝置一旦有插斷要求,中斷控制器第一時間能感應到,而且知道是哪個引腳來的中斷。同時中斷控制器還有有一個引腳與cpu的插斷要求線相連,這樣只要中斷控制器收到了io裝置的插斷要求,就立即將該訊號傳輸給cpu, 當然這個控制訊號需要經由南北橋之間的匯流排到達北橋再經過前端匯流排到達cpu,
這些匯流排和北橋都需要能解讀出插斷要求訊號,並給予傳遞。這樣cpu就能地一時間感應到外設需要插斷要求。
真是人多力量大,問題看起來好辦多了。那麼cpu只有一個引腳,他又如何知道是誰觸發了插斷要求呢?想多了,既然cpu已經感應到中斷了,不管是誰,感應之後直接通過指令向中斷控制器詢問就知道是誰來的中斷了。
中斷號查詢
cpu知道了誰插斷要求之後,又如何去尋找該中斷的中斷處理常式在哪呢?這就需要軟硬體的約定了。首先,給中斷裝置進行編號,如中斷控制器的引腳1,中斷編號為1,引腳2中斷編號為2;然後系統初始化時預先準備好每個中斷的中斷處理常式加入記憶體,然後提供一個中斷表,依次存放每個中斷處理常式的入口地址,而且我們還可以預設這個中斷表的地址永遠在物理地址0開始,那麼cpu遇到插斷要求好,向中斷控制器擷取中斷號,然後通過中斷表找到中斷處理常式入口,即可進行中斷處理了。
早期的系統正式這麼做的。IBM PC/AT 80×86相容機使用兩片級聯的8259A可程式化中斷控制晶片集成一個中斷控制器,用於實現I/O裝置的中斷控制資料存取方式,並且能為15個裝置提供獨立的中斷控制功能,。在電腦剛開機初始化期間,ROM BIOS會分別對兩片8259A晶片進行初始化,並分別把15級中斷優先順序分配給時鐘定時器、鍵盤、串列口、列印口、磁碟片控制、副處理器和硬碟等裝置或控制器使用。同時在記憶體開始處0×000~0xFFF地區內建立一個中斷向量表。但是由於這些設定違背了Intel公司的要求(後面章節將會詳細說明),因此Linux作業系統在核心初始化期間又重新對8259A進行了設定。
中斷向量分配
當一台PC剛上電開機時,圖中的硬體插斷要求號會被ROM BIOS設定成如表1所示的對應中斷向量號。Linux作業系統並不直接使用這些PC預設設定好的中斷向量號。當Linux系統執行初始化操作時,它會重新設定插斷要求號與中斷向量號的對應關係。
表1: 開機時ROM BIOS設定的硬體請求處理中斷號
| 插斷要求號 |
BIOS設定的中斷號 |
用途 |
插斷要求號 |
BIOS設定的中斷號 |
用途 |
| IRQ0 |
0×08 (8) |
8253發出的100Hz時鐘中斷 |
IRQ8 |
0×70(112) |
即時鐘中斷 |
| IRQ1 |
0×09 (9) |
鍵盤中斷 |
IRQ9 |
0×71(113) |
改向至INT 0x0A |
| IRQ2 |
0x0A(10) |
接連從晶片 |
IRQ10 |
0×72(114) |
保留 |
| IRQ3 |
0x0B(11) |
串列口2 |
IRQ11 |
0×73(115) |
保留(網路介面) |
| IRQ4 |
0x0C(12) |
串列口1 |
IRQ12 |
0×74(116) |
PS/2滑鼠口中斷 |
| IRQ5 |
0x0D(13) |
並行口2 |
IRQ13 |
0×75(117) |
數學副處理器中斷 |
| IRQ6 |
0x0E(14) |
軟碟機 |
IRQ14 |
0×76(118) |
硬碟中斷 |
| IRQ7 |
0x0F(15) |
並行口1 |
IRQ15 |
0×77(119) |
保留 |
同時我們看到,早期的pc廠商,還是下了很大的功夫去做系統的設計以及bios第一層程式的開發,將系統各組件組裝成一個有機的整體,對外提供良好的系統。得益於這種技術的開放性,使得pc技術迅猛發展。