Linux中斷機(jī)制
中斷向量
中斷(interrupt)被定義為一個(gè)事件,該事件改變處理器執(zhí)行的指令順序,這樣的事件與CPU芯片內(nèi)外部硬件電路產(chǎn)生的電信號(hào)相對(duì)應(yīng)。中斷通常分為同步(synchronous)中斷和異步(asynchronous)中斷。
同步中斷指的是當(dāng)指令執(zhí)行時(shí)由CPU控制單元產(chǎn)生的,之所以稱(chēng)為同步,是因?yàn)橹挥性谝粭l指令終止執(zhí)行后CPU才會(huì)發(fā)出中斷。
異步中斷是由其他硬件設(shè)備依照CPU時(shí)鐘信號(hào)隨機(jī)產(chǎn)生的。
在Intel處理器中,同步中斷被稱(chēng)為異常,異步中斷被稱(chēng)為中斷。
異常(同步中斷)
當(dāng)CPU執(zhí)行指令時(shí)探測(cè)到一個(gè)異常,會(huì)產(chǎn)生一個(gè)處理器探測(cè)異常(processor-detected exception),可以進(jìn)一步區(qū)分,這取決于CPU控制單元產(chǎn)生異常時(shí)保存在內(nèi)核堆棧eip寄存器的值。
故障
故障(fault),通??梢约m正,一旦糾正,程序就可以重新開(kāi)始,保存在eip寄存器中的值是引起故障的指令地址。
陷阱
陷阱(trap)在陷阱指令執(zhí)行后立即報(bào)告,內(nèi)核把控制權(quán)煩給程序后就可以繼續(xù)它的執(zhí)行而不失連續(xù)性。保存在eip中的值是一個(gè)隨后要執(zhí)行的指令地址。陷阱的主要作用是為了調(diào)試程序。
異常終止
異常中止(abort),發(fā)生一個(gè)嚴(yán)重的錯(cuò)誤,控制單元出了問(wèn)題,不能在eip寄存器中保存引起異常的指令所在的確切位置。異常中止用于報(bào)告嚴(yán)重的錯(cuò)誤,例如硬件故障或系統(tǒng)表中無(wú)效的值或者不一致的值。這種異常會(huì)強(qiáng)制中止進(jìn)程。
編程異常(軟中斷)
編程異常(programmed exception),在編程者發(fā)出的請(qǐng)求時(shí)發(fā)送,是由int或int3指令觸發(fā)的。
中斷(異步中斷)
非屏蔽中斷
非屏蔽中斷,有一些危險(xiǎn)的事件才能引起非屏蔽中斷,例如硬件故障,非屏蔽中斷總是由CPU辨認(rèn)。
屏蔽中斷
可屏蔽中斷,I/O設(shè)備發(fā)出的所有中斷請(qǐng)求(IRQ)都產(chǎn)生可屏蔽中斷,一個(gè)屏蔽的中斷只要還是屏蔽的,控制單元就可以忽略它。
中斷描述符表
IDT
IDTR 中斷描述符表寄存器,通過(guò)IDTR找到中斷描述符表。
每個(gè)表項(xiàng)有8個(gè)字節(jié)組成。里面有段選擇符和偏移等信息。
段選擇符呢就要找全局描述符表(GDT)和局部描述符表(LDT),GDT和LDT有段的信息。分別用GDTR和LDTR找到它們。
中斷描述符里每個(gè)表項(xiàng)叫做門(mén)描述符,類(lèi)型分別為任務(wù)門(mén)、中斷門(mén)、陷阱門(mén)和系統(tǒng)門(mén)。
1. 任務(wù)們:Linux 并沒(méi)有采用任務(wù)門(mén)來(lái)進(jìn)行任務(wù)切換。
2. 中斷門(mén):當(dāng)控制權(quán)通過(guò)中斷門(mén)進(jìn)入中斷處理程序時(shí),處理器清 IF 標(biāo)志,即關(guān)中斷。避免嵌套中斷的發(fā)生。DPL=0
3. 陷阱門(mén):控制權(quán)通過(guò)陷阱門(mén)進(jìn)入處理程序時(shí) 維持 IF 標(biāo)志位不變,也就是說(shuō),不關(guān)中斷。DPL=0
4. 系統(tǒng)門(mén):這是 Linux 內(nèi)核特別設(shè)置的,用來(lái)讓用戶(hù)態(tài)的進(jìn)程訪(fǎng)問(wèn) Intel 的陷阱門(mén),因此,門(mén)描述 符的 DPL 為 3。通過(guò)系統(tǒng)門(mén)來(lái)激活 4 個(gè) Linux 異常處理程序,它們的向量是 3、4、5 及 128, 也就是說(shuō),在用戶(hù)態(tài)下,可以使用 int3、into、bound 及 int0x80 四條匯編指令。
TR
補(bǔ)充:
任務(wù)寄存器TR
TR用于尋址一個(gè)特殊的任務(wù)狀態(tài)段(Task State Segment,TSS)。TSS中包含著當(dāng)前執(zhí)行任務(wù)的重要信息。
TR寄存器用于存放當(dāng)前任務(wù)TSS段的16位段選擇符、32位基地址、16位段長(zhǎng)度和描述符屬性值。它引用GDT表中的一個(gè)TSS類(lèi)型的描述符。
指令LTR和STR分別用于加載和保存TR寄存器的段選擇符部分。
當(dāng)使用LTR指令把選擇符加載進(jìn)任務(wù)寄存器時(shí),TSS描述符中的段基地址、段限長(zhǎng)度以及描述符屬性會(huì)被自動(dòng)加載到任務(wù)寄存器中。當(dāng)執(zhí)行任務(wù)切換時(shí),處理器會(huì)把新任務(wù)的TSS的段選擇符和段描述符自動(dòng)加載進(jìn)任務(wù)寄存器TR中。