當周邊設備將訊號送進電腦的時候, 只能將資料放在暫存佇列中。 但是,計算機內的總管,是如何知道某個佇列裡面有東西待取呢? 計算機並非生物,它沒有知覺。所以,不能夠以敲門、按門鈴等擬人化想像, 來理解計算機取得外部資料的模式。
一個比較接近事實的擬人化想像,是周邊設備 (例如鍵盤) 一旦將資料放進暫存佇列, 就立刻在電腦內部豎起一根旗桿。 而內務總管 (或者說是 CPU) 每隔一定的時間, 就暫時放下她手上正在執行的工作,主動去檢查每個旗桿是否昇起。 如果是昇起的,就表示那旗桿所對應的暫存佇列中有新資料。 那麼她就會去取來,做適當的處理,然後再繼續執行她剛才正在做的事。 因為電腦必需「中斷」她的工作,才能取得周邊設備的資料, 所以這個工作就稱為 中斷 (interrupt)。 周邊設備都要向電腦發出 中斷要求 (interrupt request), 才能讓自己的訊號被電腦讀取。 中斷要求 簡記為 IRQ。
但是電腦的硬體設備是早就設計好的,既不能容許任意多個旗桿, 也不能隨意增減旗桿。 以 Intel 的微處理機 (microprocessor) 為例, 它只提供 16 根旗桿。每根旗桿對應一個暫存佇列。 很明顯地,不同的周邊設備應該使用不同的暫存佇列和 IRQ 旗桿, 否則訊號就會混在一起,後果不堪設想。 換句話說,一台 Intel Inside 的 PC, 最多只能有 16 個周邊裝置。 在 1980 年代,這個數字遠超過當時硬體工程師的想像, 他們認為一部個人電腦不可能需要高達 16 個周邊設備。 以下是這 16 個 IRQ 旗桿,或者說 IRQ 線路 (IRQ Lines) 的編號和通常對應的周邊設備。
IRQ 線路 | 通 常 用 途 |
---|---|
0 | 系統計時器 (像是打更的,控制電腦內所有動作的同步化) |
1 | 鍵盤 |
2 | 系統保留用,將 IRQ 線路導向到 8--15 號線路 |
3 | COM2 (二號序列埠,通常接數據機) |
4 | COM1 (一號序列埠,通常接滑鼠) |
5 | LPT2 (二號平行埠,音效卡通常選用此線路) |
6 | 軟碟機 |
7 | LPT1 (一號平行埠,通常接印表機) |
8 | 時鐘 |
9 | 無定義 |
A | 無定義 |
B | 無定義 (USB 通常選用此線路) |
C | PS2 滑鼠 |
D | 保留給輔助微處理機,例如浮點運算輔助晶片 |
E | HDD IDE0 (主要硬碟機) |
F | HDD IDE1 (次要硬碟機) |
當兩種不同的周邊設備不幸選擇了同一條 IRQ 線路來通知電腦它有資料等待讀取, 那麼內務總管想必會糊塗了。通常的後果是,兩種周邊設備之一會和電腦失去聯絡, 就好像沒有安裝一樣。 早年,幾乎每一張介面卡或是周邊設備,都附帶著軟體或是跳接腳 (jumpers) 讓使用者自行調整其對應的 IRQ 線路。 在 1995 年左右公布的「隨插即用」設計規格,或稱 PnP: Plug and Play,大大降低了為 PC 安裝周邊設備的複雜度。 所謂 PnP,簡化來說, 就是讓周邊設備自己發出訊號去和所有其他支援 PnP 設計的周邊設備協商, 找到尚未被佔據的 IRQ 線路。
事實上,要安裝 PC 的周邊設備,除了 IRQ 之外,在硬體層面還牽涉到 DMA 和 Base Memory (IO Ports);在軟體層面上,則牽涉到驅動程式 (driver)。 不過這些課題遠超過我們想要陳述的範圍。
PnP 技術可以協助解決 IRQ 線路衝突的問題,但是如果 IRQ 線路根本不夠用, 那 PnP 也是沒輒的。 如果微處理機的 IRQ 線路不再增加,那麼要解決 IRQ 線路不足這個問題, 目前看起來應該是藉由 USB (Universal Serial Bus) 介面。 USB 使得許多種不需要太快傳輸速度的周邊設備, 例如鍵盤、滑鼠、印表機、數據機、軟碟機、掃瞄機等等 (注意硬碟機不在此列,因為硬碟機需要越快越好的傳輸速度), 可以串聯在一起,而且共用一個 IRQ 線路。 因此,許多 IRQ 線路就可以被省下來了。
課外讀物:
[1] Linux Gazette 提供由 Blancard 所寫的
Introduction to IRQs, DMAs and Base Addresses
http://www.linuxgazette.com/issue38/blanchard.html
[2] 由 Lawyer 所寫的 The Linux Plug-and-Play-HOWTO,
雖然是為 Linux 之驅動程式設計師所寫,但不失為瞭解 PnP 技術的門徑
http://http://www.linuxdoc.org/HOWTO/Plug-and-Play-HOWTO.html
[3] USB 協會整理的 USB 答客問
http://www.usb.org/faq.html
單維彰 (00/09/30) ---