中斷/異常,是操作系統(tǒng)的驅(qū)動力,就好比汽車的發(fā)動機、飛機的引擎
是什么?
中斷是CPU對系統(tǒng)發(fā)生的某個事件作出的一種反應(yīng)
當(dāng)中斷發(fā)生時,CPU暫停正在執(zhí)行的程序,保留現(xiàn)場后自動轉(zhuǎn)去執(zhí)行相應(yīng)事件的處理程序,處理完成后返回斷點,繼續(xù)執(zhí)行被打斷的程序
為什么?
中斷的引入,為了支持CPU和設(shè)備之間的并行操作
當(dāng)CPU啟動設(shè)備進(jìn)行輸入/輸出后,設(shè)備便可以獨立工作,CPU轉(zhuǎn)去處理與此次輸入/輸出不相關(guān)的事情;當(dāng)設(shè)備完成輸入/輸出后,通過向CPU發(fā)中斷報告此次輸入/輸出的結(jié)果,讓CPU決定如何處理以后的事情(及時處理設(shè)備發(fā)來的中斷請求)
異常的引入,表示CPU執(zhí)行指令時本身出現(xiàn)的問題 (“問題”為廣泛含義)
如算術(shù)溢出、除零、取數(shù)時的奇偶錯,訪存地址時越界或執(zhí)行了“陷入指令”等,這時硬件改變了CPU當(dāng)前的執(zhí)行流程,轉(zhuǎn)到相應(yīng)的錯誤處理程序或異常處理程序或執(zhí)行系統(tǒng)調(diào)用(可使OS捕獲用戶程序提出的服務(wù)請求,也可防止用戶程序執(zhí)行過程中的破壞性活動)
Summary
>> 中斷(外中斷):外部事件,正在運行的程序不期望的(在CPU之外,打斷了CPU)
a. I/O中斷
? ? -- 在鍵盤上按下Ctrl + C
? ? -- 網(wǎng)絡(luò)上來了一個包,網(wǎng)卡接收到一個新的數(shù)據(jù)包
? ? -- 打印機打印結(jié)束了
? ? -- 讀盤結(jié)束了
b. 時鐘中斷
? ? -- 設(shè)定的定時器到了
? ? -- CPU運行的程序時間片到了
c. 硬件故障
? ? -- 筆記本電池快沒電了,報警
>> 異常(內(nèi)中斷):由正在執(zhí)行的指令引發(fā)
a. 系統(tǒng)調(diào)用
b. 頁故障/頁錯誤
? ? -- 缺頁異常
c. 保護(hù)性異常
? ? -- 一塊內(nèi)存空間標(biāo)記成只讀,當(dāng)要做一個寫操作,(操作和權(quán)限)就沖突了
d. 斷點指令
? ? -- 訪問一個內(nèi)存空間,訪問的區(qū)域地址越界了
e. 其它程序性異常
? ? -- 算術(shù)溢出
??? -- 讀內(nèi)存的時候,奇偶校驗錯
怎么辦?
從兩個角度來剖析中斷/異常機制工作原理:
1. 硬件做什么?? -- 中斷響應(yīng)
??? 捕獲中斷源發(fā)出的中斷/異常請求,以一定方式響應(yīng),將處理器控制權(quán)交給特定的處理程序(這個過程由中斷硬件部件完成)
2. 軟件怎么做?? -- 中斷處理程序
??? 識別中斷/異常類型并完成相應(yīng)的處理
重點:區(qū)分哪些是軟件(操作系統(tǒng))事先做好的工作,哪些是硬件在執(zhí)行過程中要做的規(guī)定的流程
一、設(shè)計操作系統(tǒng)時,為每一類中斷/異常事件編好相應(yīng)的處理程序
二、在操作系統(tǒng)初始化的過程中,把中斷向量表設(shè)置好(PC、PSW)
三、CPU何時響應(yīng)中斷?(硬件)
1. 在CPU每條指令執(zhí)行周期的最后時刻掃描中斷寄存器(CPU控制部件中設(shè)有中斷寄存器),查看是否有中斷信號?
2. CPU處理完當(dāng)前指令后檢測到中斷(允許中斷),判斷出中斷來源并向相關(guān)設(shè)備發(fā)確認(rèn)信號。中斷硬件將該中斷觸發(fā)器內(nèi)容按規(guī)定編碼送入PSW的相應(yīng)位,稱為中斷碼。處理器狀態(tài)被切換到內(nèi)核態(tài)
3. 中斷硬件部件保存現(xiàn)場,保存內(nèi)容(PSW、PC)到系統(tǒng)堆棧里面(保存被中斷程序的重要上下文環(huán)境)(#關(guān)鍵寄存器的信息)
4. 中斷硬件根據(jù)中斷碼查中斷向量表,得到對應(yīng)的中斷處理程序(具體步驟見 X86 處理器對中斷/異常的支持)
5. 把中斷處理程序的入口地址等相關(guān)信息推送到相應(yīng)的寄存器(PC)
6. 下一個指令周期開始,執(zhí)行中斷處理程序
7. 若無中斷信號(或禁止中斷),繼續(xù)執(zhí)行下一條指令
a. 中斷向量表(軟硬件結(jié)合的數(shù)據(jù)結(jié)構(gòu))
中斷向量:一個內(nèi)存單元,存放中斷處理程序入口地址和程序運行時所需的處理機狀態(tài)字

b. Linux中的中斷向量表

四、執(zhí)行中斷處理程序(軟件)
1. 保存相關(guān)寄存器信息(現(xiàn)場信息)到系統(tǒng)堆棧(#其它寄存器的信息)
2. 分析中斷/異常的具體原因(哪一類中斷/異常,比如打印機,是正常打印結(jié)束還是缺紙還是缺墨)
3. 根據(jù)具體原因執(zhí)行對應(yīng)的處理功能(比較具體的工作)
4. 恢復(fù)現(xiàn)場,返回被事件打斷的程序
五、中斷處理結(jié)束(硬件)
中斷處理結(jié)束時,CPU檢測到中斷返回指令,從系統(tǒng)堆棧中恢復(fù)被中斷程序的上下文環(huán)境,CPU狀態(tài)恢復(fù)成原來的狀態(tài),PSW和PC恢復(fù)成中斷前的值,CPU開始一個新的指令周期
Summary
軟件提前設(shè)置好,硬件部件來執(zhí)行
X86 處理器對中斷/異常的支持
兩個概念:
1. 中斷向量表(Interrupt Vector)(實模式)
2. 中斷描述符表(Interrupt Descriptor Table)(保護(hù)模式)
??? 采用門(gate)描述數(shù)據(jù)結(jié)構(gòu)表示中斷向量
四種類型門描述符:
a. 任務(wù)門(Task Gate)
b. 中斷門(Interrupt Gate)
??? -- 給出段選擇符(Segment Selector)、中斷/異常程序的段內(nèi)偏移量(Offset)
??? -- 通過中斷門后系統(tǒng)會自動禁止中斷
c. 陷阱門(Trap Gate)
??? -- 與中斷門類似,但通過陷阱門后系統(tǒng)不會自動禁止中斷
d. 調(diào)用門(Call Gate)

通過IDTR寄存器可以得到中斷描述符表的地址,中斷描述符表的每一行叫做中斷描述符或門描述符
中斷描述符是64位,里面有門類型(是中斷門還是陷阱門)、特權(quán)級DPL,通過中斷描述符,得到了一個段選擇符
段選擇符其實就是一個索引(在GDT表中的索引還是在LDT表中的索引),它也有特權(quán)級
中斷處理程序的相關(guān)信息放在全局描述符表,通過用段選擇符在全局描述符表中查找得到段描述符
段描述符中也有相應(yīng)的權(quán)限(屬性),主要關(guān)注的是段的基地址
有了段的基地址,有了在中斷描述符當(dāng)中的偏移量,就得到中斷服務(wù)程序的入口地址

中斷/異常的硬件處理過程:
1. 確定與中斷或異常關(guān)聯(lián)的向量i
2. 通過IDTR寄存器找到IDT表,獲得中斷描述符(表中的第i項)
3. 從GDTR寄存器獲得GDT的地址;結(jié)合中斷描述符中的段選擇符,在GDT表獲取對應(yīng)的段描述符;從該段描述符中得到中斷或異常處理程序所在的段基址
4. 特權(quán)級檢查
5. 檢查是否發(fā)生了特權(quán)級的變化,如果是,則進(jìn)行堆棧切換(必須使用與新的特權(quán)級相關(guān)的棧)
6. 硬件壓棧,保存上下文環(huán)境;如果異常產(chǎn)生了硬件出錯碼,也將它保存在棧中
7. 如果是中斷,清IF位
8. 通過中斷描述符中的段內(nèi)偏移量和段描述符中的基地址,找到中斷/異常處理程序的入口地址,執(zhí)行其第一條指令
Summary:
中斷,多道程序操作系統(tǒng)的基點,沒有中斷機制程序只能從頭一直運行結(jié)束才有可能開始運行其他程序
(完)