圖解中斷 | 中斷從產(chǎn)生到消失的一生
本文轉(zhuǎn)載自微信公眾號(hào)「虛機(jī)」,作者cloud3 。轉(zhuǎn)載本文請(qǐng)聯(lián)系虛機(jī)公眾號(hào)。
中斷系統(tǒng)是現(xiàn)代PC的基礎(chǔ)架構(gòu)之一。中斷處理在操作系統(tǒng)也具有舉足輕重的作用 。
中斷處理,伴隨著軟硬件的協(xié)同,伴隨著外設(shè)與CPU的傳遞,伴隨著內(nèi)核棧和用戶棧的切換,下面我們就看一下中斷短暫而充實(shí)的一生。
以上是從設(shè)備觸發(fā)到中斷處理函數(shù)處理完畢的整個(gè)流程,為了看到中斷處理的全貌,我們隱藏了一些實(shí)現(xiàn)細(xì)節(jié),具體的細(xì)節(jié)以后再單獨(dú)描述。
下面對(duì)每個(gè)調(diào)節(jié)進(jìn)行簡(jiǎn)單的描述。
從設(shè)備到APIC
外部中斷的發(fā)起者是設(shè)備,設(shè)備通過電平觸發(fā)IRQ信號(hào)線產(chǎn)生一個(gè)中斷。
檢測(cè)到中斷信號(hào)后,IOAPIC使用寫內(nèi)存的方式把中斷信息發(fā)送到系統(tǒng)總線上。
LAPIC接收到中斷信息后把中斷能否發(fā)送給CPU處理。
CPU內(nèi)部
CPU感知到中斷線后,從LAPIC上接收中斷號(hào)。
切換到內(nèi)核棧。保存當(dāng)前進(jìn)程棧,例如在X86上會(huì)保存SS, ESP, EFLAGS, CS, EIP以及錯(cuò)誤碼。
然后通過IDTR寄存器和中斷號(hào)找到中斷服務(wù)程序的入口。
中斷處理程序
一般把中斷處理分為兩個(gè)半部:中斷處理程序是上半部(top half)和下半部(bottom half)。
上半部立會(huì)即執(zhí)行,只做有嚴(yán)格時(shí)限的工作,例如對(duì)接收的中斷進(jìn)行應(yīng)答或復(fù)位硬件,這些工作都是在所有中斷被禁止的情況下完成的。
能夠被允許稍后完成的工作會(huì)推遲到下半部(bottom half)去做。
從中斷處理返回到CPU
恢復(fù)之前保存的flag和寄存器狀態(tài),恢復(fù)之前運(yùn)行的進(jìn)程。
再到中斷處理程序
運(yùn)行中斷處理程序的下半部,把中斷任務(wù)執(zhí)行完成。
上面為了看到中斷處理的全貌,我們隱藏了一些實(shí)現(xiàn)細(xì)節(jié),具體的細(xì)節(jié)后面會(huì)在單獨(dú)描述。