6.2.180x86中斷結(jié)構(gòu)及類型
80x86 CPU中斷系統(tǒng)的結(jié)構(gòu)示意圖。根據(jù)中斷源與CPU的相對(duì)位置關(guān)系,可分為外部中斷(或硬件中斷)和內(nèi)部中斷(或軟件中斷)兩大類。在32位CPU中,把外部中斷稱為中斷,把內(nèi)部中斷稱為異常(Exceptions)。
1.中斷
中斷是指由外部設(shè)備觸發(fā)請(qǐng)求而引起的硬件中斷。80x86 CPU的硬件中斷有兩個(gè):一個(gè)是由NMI引腳引入不可屏蔽中斷,請(qǐng)求觸發(fā)方式為上升沿(0到 1的跳變信號(hào))有效;另一個(gè)是由INTR引腳引入可屏蔽中斷,請(qǐng)求觸發(fā)方式為高電平有效。但由于多數(shù)外部設(shè)備的I/O傳送中斷請(qǐng)求都是通過(guò)可屏蔽中斷引入 的,而CPU的可屏蔽中斷請(qǐng)求(INTR)引腳只有一個(gè),不能滿足外部設(shè)備的需要,因此在80x86 CPU系統(tǒng)中擴(kuò)展一片或多片中斷控制器8259A協(xié) 助CPU管理中斷,單片8259A可以管理8級(jí)外部中斷請(qǐng)求IR0~I(xiàn)R7,在多片級(jí)連方式下,最多可以管理64級(jí)的外部中斷請(qǐng)求(8259A的中斷管理 功能見6.3節(jié))。
2.異常
異常是指在CPU執(zhí)行程序過(guò)程中,因各種錯(cuò)誤引起的中斷,如地址非法、校驗(yàn)出錯(cuò)、頁(yè)面失效、存取訪問(wèn)控制錯(cuò)、結(jié)果溢出、除數(shù)為0、非法指令等。根據(jù)系統(tǒng)對(duì)產(chǎn)生異常的處理方法不同,通常分為下列三種類型。
1)故障(Faults)
故障是指某條指令在啟動(dòng)之后真正執(zhí)行之前,被檢測(cè)到異常而產(chǎn)生的一種中斷。這類異常是在引起異常的指令執(zhí)行前產(chǎn)生的,待異常處理完成后繼續(xù)返回該指令, 重行啟動(dòng)并執(zhí)行完成。例如,在啟動(dòng)某條指令時(shí)要訪問(wèn)的數(shù)據(jù)未找到(存儲(chǔ)出錯(cuò)),這種情況下當(dāng)前指令被掛起,中斷處理之后,由掛起指令處重新啟動(dòng)。
2)陷阱(Traps)
陷阱是在中斷指令執(zhí)行過(guò)程中引起的中斷。這類異常主要是由執(zhí)行“斷點(diǎn)指令”或中斷調(diào)用指令(INT n)引起,即在執(zhí)行指令后產(chǎn)生的異常,在中斷處理前要保護(hù)設(shè)置陷阱的下一條指令的地址(斷點(diǎn)),中斷處理完畢返回到該斷點(diǎn)處繼續(xù)執(zhí)行。
3)終止(Abort)
終止通常由硬件錯(cuò)誤或系統(tǒng)表出現(xiàn)非法數(shù)據(jù)引起。異常發(fā)生后一般無(wú)法確定造成異常指令的準(zhǔn)確位置,程序無(wú)法繼續(xù)執(zhí)行,中斷處理須重新啟動(dòng)系統(tǒng)。
以上三類異常的差別主要表現(xiàn)在兩個(gè)方面:一是發(fā)生異常的報(bào)告方式,二是異常處理程序的返回方式。故障這類異常的報(bào)告是在引起異常的指令執(zhí)行之前發(fā)生的, 待異常處理完畢,返回該指令繼續(xù)執(zhí)行;陷阱這類異常的報(bào)告是在引起異常的指令執(zhí)行之后發(fā)生的,待異常處理完畢,返回該指令的下一條指令繼續(xù)執(zhí)行;終止這類 異常的情況比較嚴(yán)重,它是因?yàn)橄到y(tǒng)硬件或參數(shù)出現(xiàn)了錯(cuò)誤而引起的,引起異常的程序?qū)o(wú)法恢復(fù),必須重新啟動(dòng)系統(tǒng)。
80x86 CPU 最多可以管理256種類型的中斷與異常,類型及功能。每一種中斷賦予一個(gè)中斷類型號(hào),其中:中斷類型0~17分配給內(nèi)部中斷(類型2除外);中斷類型 18~31留作備用,為生產(chǎn)廠家開發(fā)軟硬件使用;中斷類型32~255留給用戶,可作為外部設(shè)備進(jìn)行輸入輸出數(shù)據(jù)傳送時(shí)的可屏蔽中斷(INTR)請(qǐng)求使 用。
前5個(gè)中斷類型(類型0~類型4):除法錯(cuò)、單步、NMI、斷點(diǎn)、溢出,從8086~Pentium的所有CPU都是相同的,其他中斷類型適用于286及向上兼容的386、486及Pentium微處理器。
幾種異常類型做簡(jiǎn)要說(shuō)明。
類型0:除法出錯(cuò)。當(dāng)CPU進(jìn)行除法運(yùn)算時(shí),若除數(shù)為0或商溢出時(shí)產(chǎn)生該中斷。
類型1:?jiǎn)尾。?dāng)單步執(zhí)行標(biāo)志TF1且IF1時(shí),每執(zhí)行一條指令就引起一次中斷。
類型3:斷點(diǎn)。這是一個(gè)特殊的單字節(jié)斷點(diǎn)指令I(lǐng)NT 3,常用于調(diào)試程序時(shí)存儲(chǔ)程序的斷點(diǎn)。當(dāng)CPU執(zhí)行該指令時(shí),則產(chǎn)生“斷點(diǎn)指令”中斷,將下一條指令的地址入棧保存。
類型4:溢出。當(dāng)執(zhí)行INTO指令且溢出標(biāo)志OF1時(shí)產(chǎn)生該中斷。
類型5:越界。當(dāng)CPU執(zhí)行BOUND指令時(shí),檢測(cè)到操作數(shù)超越邊界時(shí)產(chǎn)生該中斷。