通過初始化編程向8259A寫入相應的初始化命令ICW,可以使芯片處於一個規定的基本工作方式,並在此方式下進行工作。8259A的初始化命令字共有4個ICW1-ICW4,進行初始化時要求ICW1-ICW4按一定的順序寫入。
首先,一個外部中斷請求信號通過中斷請求線 IRQ ,傳輸到 IMR (中斷屏蔽寄存器) , IMR 根據所設定的中斷屏蔽字( OCW1 ),決定是將其丟棄還是接受。如果可以接受,則 8259A 將 IRR (中斷請求暫存寄存器)中代表此 IRQ 的位置位,以表示此 IRQ 有中斷請求信號,並同時向 CPU 的 INTR (中斷請求) 管腳發送一個信號,但 CPU 這時可能正在執行一條指令,因此 CPU 不會立即響應,而當這 CPU 正忙着執行某條指令時,還有可能有其余的 IRQ 線送來中斷請求,這些請求都會接受 IMR 的挑選,如果沒有被屏蔽,那么這些請求也會被放到 IRR 中,也即 IRR 中代表它們的 IRQ 的相應位會被置 1 。
當 CPU 執行完一條指令時后,會檢查一下 INTR 管腳是否有信號,如果發現有信號,就會轉到中斷服務,此時, CPU 會立即向 8259A 芯片的 INTA (中斷應答) 管腳發送一個信號。當芯片收到此信號后,判優部件開始工作,它在 IRR 中,挑選優先級最高的中斷,將中斷請求送到 ISR (中斷服務寄存器) ,也即將 ISR 中代表此IRQ 的位置位,並將 IRR 中相應位置零,表明此中斷正在接受 CPU 的處理。同時,將它的編號寫入中斷向量寄存器 IVR 的低三位( IVR 正是由 ICW2 所指定的,不知你是否還記得 ICW2 的最低三位在指定時都是 0 ,而在這里,它們被利用了!)這時, CPU 還會送來第二個 INTA 信號,當收到此信號后,芯片將 IVR 中的內容,也就是此中斷的中斷號送上通向 CPU 的數據線。
這里需要理解的是中斷屏蔽與優先級判定並不是一回事,如果被屏蔽了,那么參加判定的機會也都沒了。在默認情況下, IRQ0 的優先級最高, IRQ7 最低。當然我們可以更改這個設定,這樣在下面有詳細描述。
言歸正傳,當芯片把中斷號送上通往 CPU 的數據線后,就會檢測 ICW4 中的 EOI 是否被置位。如果 EOI 被置位表示需要自動清除中斷請求信號,則芯片會自動將 ISR 中的相應位清零。如果 EOI 沒有被置位,則需要中斷處理程序向芯片發送 EOI 消息 ,芯片收到 EOI 消息后才會將 ISR 中的相應位清零。
這里的機關存在於這樣一個地方。優先權判定是存在於 8259A 芯片中的,假如 CPU 正在處理 IRQ1 線來的中斷,這時 ISR 中 IRQ1 所對應的位是置 1 的。這時來了一個 IRQ2 的中斷請求, 8259A 會將其同 ISR 中的位進行比較,發現比它高的 IRQ1 所對應的位被置位,於是 8259A 會很遺憾的告訴 IRQ2 :你先在 IRR 中等等。而如果這時來的是 IRQ0 ,芯片會馬上讓其進入 ISR ,即將 ISR 中的 IRQ0 所對應的位置位,並向 CPU 發送中斷請求。這時由於 IRQ1 還在被 CPU 處理,所以 ISR 中 IRQ1 的位也還是被置位的,但由於 IRQ0 的優先級高,所以 IRQ0 的位也會被置位,並向 CPU 發送新的中斷請求。此時 ISR 中 IRQ0 與 IRQ1 的位都是被置位的,這種情況在多重中斷時常常發生,非常正常。
如果 EOI 被設為自動的,那么 ISR 中的位總是被清零的(在 EOI 被置位的情況下, 8259A 只要向 CPU 發送了中斷號就會將 ISR 中的相應位清零),也就是如果有中斷來,芯片就會馬上再向 CPU 發出中斷請求,即使CPU 正在處理 IRQ0 的中斷, CPU 並不知道誰的優先級高,它只會簡單的響應 8259A 送來的中斷,因此,這種情況下低優先級的中斷就可能會中斷高優先級的中斷服務程序。所以在 PC 中,我們總是將 EOI 位清零,而在中斷服務程序結束的時候才發送 EOI 消息。
8259A是一個中斷控制器。在一個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為止.