操作系統學習(十五) 、異常與中斷處理


一、中斷調用過程

處理器對異常和中斷的處理過程的調用 操作方法與使用CALL指令調用程序過程和任務的方法類似。當響應一個異常或中斷時,處理器使用異常或中斷的向量作為IDT表的索引。如果索引指向中斷門或陷阱門,則處理器使用與CALL指令操作任務門類似的方法進行任務切換,執行異常或中斷處理任務。

異常或中斷門引用運行在當前任務上下文中的異常或中斷處理過程。門中的段選擇符指向GDT或當前LDT中的可執行代碼段描述符。門描述符中的偏移字段指向異常或中斷處理過程的開始處。

中斷調用過程

當處理器執行異常或中斷處理過程調用時會進行一下操作;

  • 如果處理器過程在搞特權級上執行時就會發生堆棧切換操作。堆棧切換過程如下:

    • 處理器從當前執行任務的TSS段中得到中斷或異常處理過程使用的堆棧的段選擇符和棧指針。然后處理器會把被中斷程序(或任務)的棧選擇符和棧指針壓入新棧中。
    • 接着處理器會吧EFLAFS、CS和EIP寄存器的當前值也壓入新棧中。
    • 如果異常會產生一個錯誤號,那么該錯誤號也會被最后壓入新棧中。
  • 如果處理過程將在被中斷任務同一個特權級上運行,那么:

    • 處理器會把EFLAGS、CS和EIP寄存器的當前值保存在當前堆棧上。
    • 如果異常會產生一個錯誤號,那么該錯誤號也會被最后壓入新棧中。

轉移到中斷處理過程時堆棧使用方法

為了從中斷處理過程中返回,處理過程必須使用IRET指令。IRET指令與RET指令相似,但IRET指令還會把保存的寄存器內容恢復到EFLAFS中。不過只有當CPL是0時才會恢復EFLAFS中的IOPL字段,並且只有當CPL<=IOPL時,IF標志才會被改變。如果當調用中斷處理過程時發生了堆棧切換,那么在返回時IRET指令會切換回原來的堆棧。

二、異常或中高端處理過程的保護

異常和中斷處理過程的特權級保護機制與通過調用門調用普通過程類似。處理器不允許把控制轉移到比CPL更低特權級代碼段的中斷處理過程中,否則將產生一個一般保護性異常。另外中斷和異常的保護機制在一下方面與一般調用門過程不同:

  • 因為中斷和異常向量沒有RPL,因此在隱式調用異常和中斷處理過程時不會檢查RPl。
  • 只有當一個異常或中斷時利用INT n、INT 3 或INTO指令產生時,處理器才會檢查中斷或陷阱門中的DPL。此時CPL必須小於等於們的DPL。這個限制可以防止運行在特權級3的應用程序使用軟件中斷訪問重要的異常處理過程,例如頁錯誤處理過程,假設這些處理過程已被存放在更高特權級的代碼段中。對於硬件產生的中斷和處理器檢測到的異常,處理器會忽略中斷門和陷阱門中的DPL。 因為異常和中斷通常不會定期發生。這個技術可以用於只需已訪問堆棧上的數據的處理過程。如果處理程序需要數據段中的數據,那么特權級 3 必須能夠訪問這個數據段,但這樣就沒保護可言了。
  • 處理過程可以放在具有特權級 0 的非一致代碼段中。這種處理過程總是可以執行的,而不管被中斷程序或任務的當前特權級CPl。

三、異常或中斷處理過程標志的使用方式

當通過中斷門或陷阱門訪問一個異常或中斷處理過程,處理器會在把EFLAGS寄存器內容保存到堆棧上之后清除EFLAGS中的TF標志。清除TF標志可以防止指令跟蹤影響中斷響應。而隨后的IRET指令會用堆棧上的內容恢復EFLAGS的原TF標志。

中斷門與陷阱門唯一的區別在於處理器操作EFLAGS寄存器TF標志的方法。當通過中斷門訪問一個異常或中斷處理過程時,處理器會復位TF標志以防止其他中斷干擾當前中斷處理過程。隨后IRET指令則會用保存在堆棧上的內容恢復EFLAGS寄存器的TF標志,而通過陷阱門訪問處理過程並不會影響TF標志位。

四、執行中斷處理過程的任務

當通過IDT表中任務門訪問異常或中斷處理過程時,就會導致任務切換。從而可以在一個專用任務中執行中斷或異常處理過程。IDT表中的任務門引用GDT中的TSS描述符。切換處理過程任務的方法與普通任務切換一樣。

五、中斷處理任務

當通過IDT中任務門來訪問異常或中斷處理過程時就會導致任務切換。使用單獨的任務來處理異常或中斷有以下好處:

  • 被中斷程序或任務的完整上下文會被自動保存;
  • 在處理異常或中斷時,新的 TSS 可以允許處理過程使用新特權級 0 的堆棧。在當前特權級 0 的堆棧已毀壞時如果發生了一個異常或中斷,那么在為中斷過程提供一個新特權級0的堆棧條件下,通過任務門訪問中斷處理過程能夠防止系統崩潰。
  • 通過使用黨的的IDT給中斷或異常處理過程獨立的地址空間,可以把它與其它任務隔離開來。 使用獨立任務處理異常或中斷的不足之處是: 在任務切換時必須對大量機器狀態進行保存,使得它比使用中斷門的響應速度要慢,導致中斷延時增加。

IDT中的任務門會引用 GDT中的TSS 描述符。切換到句柄任務的過程與普通任務切換過程相同。到被中斷任務的反向鏈接會被保存在句柄任務TSS的前一任務鏈接字段中。如果一個一場會產生一個出錯碼,該出錯碼會被復制到新任務堆棧上。

當異常或中斷句柄任務用於操作系統中時,實際上有兩種分派調度任務的機制:操作系統軟件調度和處理器中斷機制的硬件調度。試用軟件調度方法時需要考慮到中斷開啟時采用中斷處理任務。

中斷處理任務切換

六、錯誤碼

當異常條件與一個特定的段相關時,處理器會把一個錯誤碼壓入異常處理過程的堆棧上。出錯碼的格式如下所示:

錯誤碼格式
  • 位 0 是外部事件 EXT 標志。當置位時,表示執行程序以外的事件造成了異常,例如硬件中斷。
  • 位 1 是描述符位置 IDT 標志。當該位置位時,表示錯誤碼的索引部分指向 IDT中的一個門描述符。當該位復位時,表示索引部分指向GDT或LDT中的一個段描述符。
  • 位 2 是 GDT/LDT 表選擇標志 TI。當有當位 1 的IDT=0 才有用。當 TI=1時,表示錯誤碼的索引部分指向LDT中的一個描述符。當TI=0時,說明錯誤碼中的索引部分指向GDT表中的一個描述符。

​ 段選擇索引字段提供了錯誤碼引用的IDT、GDT或者當前LDT中段或門描述符的索引值。在某些情況下錯誤碼是空的(即低16位全為0)。空錯誤碼表示錯誤不是由於引用某個特地給段造成的,或者是在操作中引用了一個空段描述符。

​ 頁故障異常的錯誤碼格式與上面不同,只有最低三個比特位有用,他們的名稱與頁表項中的最后三位相同(U/S、W/R、P)。如下所示:

頁面故障錯誤碼格式
  • 位 0 (P),異常是由於頁面不存在或違反訪問特權而引發,P=0,表示頁不存在;P=1表示違反也級保護權限。
  • 為 1 (W/R),異常時由於內存讀或寫操作引起。W/R=0,表示由讀操作引起;W/R=1,表示由寫操作引起。
  • 位 2 (U/S),發生異常時CPU執行的代碼級別。U/S=0;表示CPU正在執行超級用戶代碼;U/S=1,表示CPU正在執行一般用戶代碼。

另外,處理器還會把引起頁面故障異常所訪問的地址存放在CR2中。也出錯異常處理程序可以使用這個地址來定位相關的頁目錄和頁表項。注意,錯誤不會被 IRET指令自動地彈出堆棧,因此中斷處理程序在返回之前必須清除堆棧上的錯誤碼。另外,雖然處理產生的某些異常會產生錯誤碼並會自動地保存到處理過程的堆棧中,但是外部硬件中斷或者重新執行 INT n 指令產生的異常並不會把錯誤碼壓入堆棧中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM