從Intel 8086/8088、286、386、486直到Pentium系列微處理器,它們中斷系統(tǒng)的結(jié)構(gòu)基本相同,不同之處主要有兩點(diǎn):一是 因CPU的工作模式不同,獲取中斷向量的方式有所不同;二是因系統(tǒng)的配置不同,所處理的中斷類型有差別。本節(jié)先討論80x86的中斷系統(tǒng)的結(jié)構(gòu)及中斷類 型,然后介紹CPU工作在不同模式下的中斷處理方式。
6.2.180x86中斷結(jié)構(gòu)及類型
80x86 CPU中斷系統(tǒng)的結(jié)構(gòu)示意圖。根據(jù)中斷源與CPU的相對位置關(guān)系,可分為外部中斷(或硬件中斷)和內(nèi)部中斷(或軟件中斷)兩大類。在32位CPU中,把外部中斷稱為中斷,把內(nèi)部中斷稱為異常(Exceptions)。
1.中斷
中斷是指由外部設(shè)備觸發(fā)請求而引起的硬件中斷。80x86 CPU的硬件中斷有兩個(gè):一個(gè)是由NMI引腳引入不可屏蔽中斷,請求觸發(fā)方式為上升沿(0到 1的跳變信號(hào))有效;另一個(gè)是由INTR引腳引入可屏蔽中斷,請求觸發(fā)方式為高電平有效。但由于多數(shù)外部設(shè)備的I/O傳送中斷請求都是通過可屏蔽中斷引入 的,而CPU的可屏蔽中斷請求(INTR)引腳只有一個(gè),不能滿足外部設(shè)備的需要,因此在80x86 CPU系統(tǒng)中擴(kuò)展一片或多片中斷控制器8259A協(xié) 助CPU管理中斷,單片8259A可以管理8級外部中斷請求IR0~I(xiàn)R7,在多片級連方式下,最多可以管理64級的外部中斷請求(8259A的中斷管理 功能見6.3節(jié))。
2.異常
異常是指在CPU執(zhí)行程序過程中,因各種錯(cuò)誤引起的中斷,如地址非法、校驗(yàn)出錯(cuò)、頁面失效、存取訪問控制錯(cuò)、結(jié)果溢出、除數(shù)為0、非法指令等。根據(jù)系統(tǒng)對產(chǎn)生異常的處理方法不同,通常分為下列三種類型。
1)故障(Faults)
故障是指某條指令在啟動(dòng)之后真正執(zhí)行之前,被檢測到異常而產(chǎn)生的一種中斷。這類異常是在引起異常的指令執(zhí)行前產(chǎn)生的,待異常處理完成后繼續(xù)返回該指令, 重行啟動(dòng)并執(zhí)行完成。例如,在啟動(dòng)某條指令時(shí)要訪問的數(shù)據(jù)未找到(存儲(chǔ)出錯(cuò)),這種情況下當(dāng)前指令被掛起,中斷處理之后,由掛起指令處重新啟動(dòng)。
2)陷阱(Tra
ps)
陷阱是在中斷指令執(zhí)行過程中引起的中斷。這類異常主要是由執(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ā)生后一般無法確定造成異常指令的準(zhǔn)確位置,程序無法繼續(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法恢復(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)請求使 用。
前5個(gè)中斷類型(類型0~類型4):除法錯(cuò)、單步、NMI、斷點(diǎn)、溢出,從8086~Pentium的所有CPU都是相同的,其他中斷類型適用于286及向上兼容的386、486及Pentium微處理器。
幾種異常類型做簡要說明。
類型0:除法出錯(cuò)。當(dāng)CPU進(jìn)行除法運(yùn)算時(shí),若除數(shù)為0或商溢出時(shí)產(chǎn)生該中斷。
類型1:單步。當(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í),檢測到操作數(shù)超越邊界時(shí)產(chǎn)生該中斷。