2008年8月13日 星期三

中斷與異常處理的前期硬體作業

某個周邊設備已經產生了一次中斷要求。該要求通過中斷控制器 8259A 到達了 CPU 的中斷要求引腳 INTR。由于中斷是開着的,所以當執行完一條指令后,cs 和 eip 這對暫存器中已經包含了下一條將要執行的指令的位址。在處理那條指令之前, 控制單元會檢查在執行前一條指令時是否發生了一個中斷或不規則。如果發生了一個中斷和不規則,那麼CPU執行下列作業:

1. 確定與中斷或異常關聯的向量 i(0≤ i ≤255)

2. 讀取由IDTR指向的 IDT 表中的第 i 项trap or interrupt gate descriptor。將該descriptor中的code segment selector載入到CS, 該descriptor中的offset載入到EIP,CPU透過接來的步驟得出GDT中查找中斷或異常處理函式所在的code segment的base address,再與offset相加即得到中斷或異常處理函式的linear address(中斷或異常處理函式的第一條指令位址),另外接來的步驟作privilege level checking與執行完中斷或異常處理函式的return infromation儲存 。CPU所执行的最后一步就是跳轉到中断或异常处理程序。當CPU 處理完中断信號後,CPU所要執行的指令就是被先前被選中中斷或異常處理函式的第一條指令。

3. 透過由”2”讀取到的descriptor中的code segment selector在GDT中查找中斷或異常處理函式所在的code segment的descriptor,並由該descriptor讀取code segment的base address。

4. 取發出中斷或異常程式(Interrupted Procedure)的CPL與code segment 的DPL作比較,如果CPL < DPL 則CPU就向系統發出#GP(General Protection) fault。如果中斷源是來自INT n, INT 3 (Breakpoint), 或INTO指令,則CPU會另外比較中斷或異常函式或程式的CPL與gate的DPL,如果CPL > DPL (of gate)則PU就向系統發出#GP(General Protection) fault。如此的進一步檢查,是防止software (with CPL=3)透過gate (with DPL=0)去執行需權限較高的中斷或異常處理函式(with DPL=0)例如:page-fault handler。

5. CPU在中斷或異常函式或程式之前會將以下的內容預先載入到發出中斷或異常程式(Interrupted Procedure)的calling stack:(1) EFLAGS, (2)CS (segment of return address), (3)EIP (offset of retrun address), (4)error code (如果異常發生,該異常產生錯誤碼的話)。如果發出中斷或異常程式的CPL > code segment 的DPL,即發生了privilege level change 間接也就發生了stack switch,也就將Interrupted Procedure的calling stack 轉換成中斷或異常handler的 calling stack,而該satck的SS與ESP可在TSS中取得,則CPU會將以下的內容預先載入到handler的 calling stack: (1) SS, (2)ESP, (3) EFLAGS, (4)CS (segment of return address), (5)EIP (offset of retrun address), (6)error code (如果異常發生,該異常產生錯誤碼的話)。

沒有留言: