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