硬件處理我們在每條指令完成的時(shí)候,控制單元就會檢查是否發(fā)生了中斷。若不發(fā)生:繼續(xù)執(zhí)行下...
確定中斷的向量i。
讀IDT中的第i項(xiàng)得到向量i的中斷描述符。
2.
異常處理
保存寄存器的值
高級C函數(shù)處理異常
3..中斷描述符結(jié)合GDT得到得到中斷處理程序的段描述符。
4.進(jìn)程的CPL與段描述符的DPL比較,若CPL優(yōu)先級比DPL的優(yōu)先級高,說明中斷的優(yōu)先級比進(jìn)程優(yōu)先級低,產(chǎn)生異常。進(jìn)程的CPL與中斷描述符的DPL比較,若CPL優(yōu)先級
比DPL的優(yōu)先級低,說明這個(gè)門不是用戶進(jìn)程可以訪問的,也產(chǎn)生異常,正常則執(zhí)行下面步驟。
5.檢查CPL是否發(fā)生變化(這個(gè)其實(shí)就是是否是從用戶態(tài)進(jìn)入內(nèi)核態(tài)),如果變化,則要切換棧。這個(gè)很容易弄清,因?yàn)椋脩魬B(tài)和內(nèi)核態(tài)用的棧是不一樣的。
6.如果發(fā)生的是故障,故障要重新執(zhí)行導(dǎo)致異常的那條指令。所以用那條指令的地址裝載cs和eip來執(zhí)行那條指令。
7.將eflags、cs、和eip的值圧棧。
8.如果異常產(chǎn)生硬件出錯碼,則也圧棧。
9.用剛才得到的段描述符中的基址和中段描述符中的偏移地址裝載cs和eip。這個(gè)就可以開始執(zhí)行相應(yīng)的處理程序了。