經過初始化編程向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爲止.