中斷的來源除了來自於硬體自身的NMI中斷和來自於軟體的INT n指令造成的軟體中斷之外,還有來自於外部硬體裝置的中斷,這些中斷是可屏蔽的。這些中斷也都通過PIC(Programmable Interrupt Controller)進行控制,並傳遞給CPU。在IBM PC極其相容機上所使用的PIC是Intel 8259A晶片。8259A晶片的功能非常強大,但在IBM PC上,只用到比較簡單的功能。
一個8259A晶片的可以接最多8個中斷源,但由於可以將2個或多個8259A晶片級連(cascade),並且最多可以級連到9個,所以最多可以接64個中斷源。早期,IBM PC/XT只有1個8259A,. 但設計師們馬上意識到這是不夠的,於是到了IBM PC/AT,8259A被增加到2個以適應更多外部裝置的需要,其中一個被稱作Master,另外一個被稱作Slave,Slave以級連的方式串連在Master上。如今絕大多數的PC都擁有兩個8259A,這樣 最多可以接收15個中斷源。
通過8259A可以對單個中斷源進行屏蔽。
Principle
在一個8259A晶片有如下幾個內部寄存器:
Interrupt Mask Register (IMR)
Interrupt Request Register (IRR)
In Sevice Register (ISR)
IMR被用作過濾被屏蔽的中斷;IRR被用作暫時放置未被進一步處理的Interrupt;當一個Interrupt正在被CPU處理時,此中斷被放置在ISR中。
除了這幾個寄存器之外,8259A還有一個單元叫做Priority Resolver,當多個中斷同時發生時,Priority Resolver根據它們的優先順序,將高優先順序者優先傳遞給CPU。
當一個插斷要求從IR0到IR7中的某根線到達IMR時,IMR首先判斷此IR是否被屏蔽,如果被屏蔽,則此插斷要求被丟棄;否則,則將其放入IRR中。
在此插斷要求不能進行下一步處理之前,它一直被放在IRR中。一旦發現處理中斷的時機已到,Priority Resolver將從所有被放置於IRR中的中斷中挑選出一個優先順序最高的中斷,將其傳遞給CPU去處理。IR號越低的中斷優先順序別越高,比如IR0的優先順序別是最高的。
8259A通過發送一個INTR(Interrupt Request)訊號給CPU,通知CPU有一個中斷到達。CPU收到這個訊號後,會暫停執行下一條指令,然後發送一個INTA(Interrupt Acknowledge)訊號給8259A。8259A收到這個訊號之後,馬上將ISR中對應此插斷要求的Bit設定,同時IRR中相應的bit會被reset。比如,如果當前的插斷要求是IR3的話,那麼ISR中的bit-3就會被設定,IRR中IR3對應的bit就會被reset。這表示此插斷要求正在被CPU處理,而不是正在等待CPU處理。
隨後,CPU會再次發送一個INTA訊號給8259A,要求它告訴CPU此插斷要求的中斷向量是什麼,這是一個從0到255的一個數。8259A根據被設定的起始向量號(起始向量號通過中斷控制字ICW2被初始化)加上插斷要求號計算出中斷向量號,並將其放置在Data Bus上。比如被初始化的起始向量號為8,當前的插斷要求為IR3,則計算出的中斷向量為8+3=11。
CPU從Data Bus上得到這個中斷向量之後,就去IDT中找到相應的中斷服務程式ISR,並調用它。如果8259A的End of Interrupt (EOI)通知被設定位人工模式,那麼當ISR處理完該處理的事情之後,應該發送一個EOI給8259A。
8259A得到EOI通知之後,ISR寄存器中對應於此插斷要求的Bit會被Reset。
如果8259A的End of Interrupt (EOI)通知被設定位自動模式,那麼在第2個INTA訊號收到後,8259A ISR寄存器中對應於此插斷要求的Bit就會被Reset。
在此期間,如果又有新的插斷要求到達,並被放置於IRR中,如果這些新的插斷要求中有比在ISR寄存中放置的所有中斷優先順序別還高的話,那麼這些高優先順序別的插斷要求將會被馬上按照上述過程進行處理;否則,這些中斷將會被放在IRR中,直到ISR中高優先順序別的中斷被處理結束,也就是說知道ISR寄存器中高優先順序別的bit被Reset為止。
IRQ2/IRQ9 Redirection
為什麼要將IRQ2重新導向到IRQ9上?這仍然是由於相容性問題造成的。
早期的IBM PC/XT只有一個8259A,這樣就只能處理8種IRQ。但很快就發現這根本不能滿足需求。所以到了IBM PC/AT,又以級連的方式增加了一個8259A,這樣就可以多處理7種IRQ。原來的8259A被稱作Master PIC,新增的被稱作Slave PIC。但由於CPU只有1根中斷線,Slave PIC不得不級連在Master PIC上,佔用了IRQ2,那麼在IBM PC/XT上使用IRQ2的裝置將無法再使用它;但新的系統又必須和原有系統保持相容,怎麼辦?
由於新增加的Slave PIC在原有系統中不存在,所以,設計者從Slave PIC的IRQ中挑出IRQ9,要求軟體設計者將原來的IRQ2重新導向到IRQ9上,也就是說IRQ9的中斷服務程式需要去掉用IRQ2的中斷服務程式。這樣,將原來接在IRQ2上的裝置現在接在IRQ9上,在軟體上只需要增加IRQ9的中斷服務程式,由它調用IRQ2的中斷服務程式,就可以和原有系統保持相容。而在當時,增加的IRQ9中斷服務程式是由PC開發商開發的BIOS提供的,所以就從根本上保證了相容。
Programming the 8259As
每一個8259A晶片都有兩個I/O ports,程式員可以通過它們對8259A進行編程。
Master 8259A的連接埠地址是0x20,0x21;Slave 8259A的連接埠地址是0xA0,0xA1。
程式員可以向8259A寫兩種命令字:
Initialization Command Word (ICW);這種命令字被用作對8259A晶片的初始化。
Operation Command Word (OCW):這種命令被用來向8259A發布命令,以對其進行控制。OCW可以在8259A被初始化之後的任何時候被使用。
下表的內容是Master 8259A的I/O連接埠地址,以及通過它們所能操作的寄存器。
Address Read/Write Function
0x20 Write Initialization Command Word 1 (ICW1)
Write Operation Command Word 2 (OCW2)
Write Operation Command Word 3 (OCW3)
Read Interrupt Request Register (IRR)
Read In-Service Register (ISR)
0x21 Write Initialization Command Word 2 (ICW2)
Write Initialization Command Word 3 (ICW3)
Write Initialization Command Word 4 (ICW4)
Read/Write Interrupt Mask Register (IMR)
Addresses/Registers for Master 8259A
下表的內容是Slave 8259A的I/O連接埠地址,以及通過它們所能操作的寄存器。
Address Read/Write Function
0xA0 Write Initialization Command Word 1 (ICW1)
Write Operation Command Word 2 (OCW2)
Write Operation Command Word 3 (OCW3)
Read Interrupt Request Register (IRR)
Read In-Service Register (ISR)
0xA1 Write Initialization Command Word 2 (ICW2)
Write Initialization Command Word 3 (ICW3)
Write Initialization Command Word 4 (ICW4)
Read/Write Interrupt Mask Register (IMR)
Addresses/Registers for Slave 8259A
由於8259A晶片不僅能夠用於IBM PC/X86,也可以被用作MCS-80/85,對於這兩者,在操作模式上有一些不一樣,對於某些寄存器的設定也有所不同。我們後面僅僅討論X86模式相關的內容。