異常和中斷處理

2021-10-01 04:28:50 字數 2550 閱讀 6094

引導程式被讀到記憶體後,開始執行引導程式,以裝入作業系統核心,並對gdt,idt等進行初始化,系統啟動後,進入保護模式。

每條指令執行過程中,cpu會根據執**況判定是否發生了某種內部異常事件,並在某條指令執行結束時判定是否發生了外部中斷請求(由此可見,異常事件和中斷請求的檢測都是在某一條指令執行過程中進行的,顯然有硬體完成)

在cpu根據cs和eip取下條指令之前,會根據檢測的結果判斷是否進入中斷響應階段(異常和中斷的響應也都是在某一條指令執行過程中或執行結束時進行的,顯然也由硬體完成)

ia-32處理器把所有段描述符按順序組織成線性表 放在記憶體中,稱為段描述符表。分為三類:全域性描述符表gdt,區域性描述符表ldt和中斷描述符表idt。gdt和idt在整個系統中只有一張,而每個任務 都有自己私有的一張區域性描述符表ldt,用於記錄本任務中涉及的各個**段、資料段和堆疊段以及本任務的使用的門描述符。

中斷描述符表(interrupt descriptor table, idt )是保護模式下用於儲存中斷處理程式入口的表,當cpu 接收乙個中斷時,需要用中斷向量在此表中檢索對應的描述符,在該描述符中找到中斷處理程式的起始位址,然後執行中斷處理程式。

中斷描述符表中有什麼呢?表中不僅僅有中斷描述符,還可以有任務門描述符和陷阱門描述符

中斷發生後, eflags 中的 nt 位和 tf 位會被置0。如果中斷對應的門描述符是中斷門,標誌暫存器 eflags中的if位被自動置0 ,避免中斷巢狀,即中斷處理過程中又來了個新的中斷,這是為防止在處理某個中斷的過程中又來了個相同的中斷,即同一種中斷未處理完時又來了乙個,這會導致一般保護性( gp )異常。這表示預設情況下,處理器會在無人打擾的方式下執行中斷門描述符中的中斷處理例程。若中斷發生時對應的描述符是任務門或陷阱門的話, cpu 是不會將if位清0因為陷阱門主要用於除錯,它允許 cpu 響應更高階別的中斷,所以允許中斷巢狀。而對任務門來說,這是執行 乙個新任務,任務都應該在開中斷的情況下進行,否則就獨佔 cpu 資源,作業系統也會由多工退化成單任務了。

tf表示 trap flag ,也就是陸阱標誌位,這用在除錯環境中,當tf 時表示禁止單步執行,也就是說,進入中斷後將 tf 直為 ,表示不允許申斷處理程式單步執行

nt位表示 nest task flag,即任務巢狀標誌位,也就是用來標記任務巢狀呼叫的情況。任務巢狀呼叫是指cpu 將當前正執行的舊任務掛起,轉去執行另外的新任務.iret 指令有兩個功能, 乙個是從中斷返回,另外乙個就是返回到呼叫自己執行的那個舊任務. 對同一條iret指令, cpu是如何知道該從中斷返回暱,還是返回到舊任務繼續執行呢?這就用到 nt 位了,當 cpu 執行 iret 時,它會去檢查 nt 位的值,如果 nt 位為1,這說明當前任務是被巢狀執行的,因此會從自己 tss 中「上乙個任務 tss 的指標」欄位中獲取舊任務,然後去執行該任務。如果 nt 位的值為0 ,這表示當前是在中斷處理環境下,於是就執行正常的中斷退出流程

核心中的tss段記錄了每個程序的狀態資訊,例如,每個程序對應的頁表,task和mm等結構資訊,核心棧的棧頂資訊:ss:esp等

ia-32中異常和中斷響應過程

執行中斷處理程式。

若是故障,則將發生故障的指令的邏輯位址寫入 cs 和 eip,以使處理後回到故障指令執行。其他情況下,cs 和 eip 不變,使處理後回到下條指令執行。

在當前棧中儲存 eflags、cs 和 eip 暫存器的內容(斷點和程式狀態)

異常產生了乙個硬體出錯碼,則將其儲存在核心棧中。

將idti中的段選擇符裝入cs(cs中為異常處理程式或中斷服務程式的基位址),idti中的偏移位址裝入eip,它們是異常處理程式或中斷服務程式第一條指令的邏輯位址(linux中段基址=0)

下個時鐘週期開始,從cs:eip所指處開始執行異常或中斷處理程式!

ia-32中異常和中斷的返回過程

中斷或異常處理程式最後一條指令是iret。cpu在執行iret指令過中完成以下工作

從棧中彈出硬體出錯碼(儲存過的話)、eip、cs和eflags

檢查當前異常或中斷處理程式的cpl是否等於cs中最低兩位,若則說明異常或中斷響應前、後都處於同乙個特權級,此時,iret指令完成操作;否則,再繼續完成下一步工作。

從核心棧中彈出ss和esp,以恢復到異常或中斷響應前的特權級程所使用的棧。

檢查ds、es、fs和gs段暫存器的內容,若其中有某個暫存器的選擇符指向乙個段描述符且其dpl小於cpl,則將該段暫存器清0。是為了防止惡意應用程式(cpl=3)利用核心以前使用過的段寄存(dpl=0)來訪問核心位址空間。

執行完iret指令後,cpu回到原來發生異常或中斷的程序繼續

中斷和異常

中斷和異常 中斷訊號的處理方式 分緊急部分和不緊急部分 中斷處理 必須能夠重入,以便能夠中斷巢狀 中斷和異常的產生 乙個irq interrupt request 代表中斷控制器上的一根中斷線,和乙個中斷向量 單cpu 可程式設計中斷控制器 pic 多cpu 改進的可程式設計中斷控制器 apic 乙...

中斷和異常

中斷通常定義為乙個事件,該事件改變處理器執行的指令順序。中斷通常分為同步中斷與非同步中斷。異常是同步的,i o中斷是非同步的。中斷可以分為 i o裝置發出的中斷請求 irq 都可以被遮蔽,乙個中斷被遮蔽以後,控制單元就忽略他。只有硬體故障等幾個危急事件才是非遮蔽中斷。異常可以分為 可以糾正的異常,例...

中斷和異常

1 中斷機制的誕生 早期計算機,各程式只能序列執行,系統資源利用率低,為了解決這個問題,從而誕生了作業系統 作為計算機的管理者 引入中斷機制,實現了多道程式併發執行。本質 發生中斷就意味著需要作業系統介入,開展管理工作。2 中斷的概念和作用 1 當中斷發生時,cpu立即進入核心態。2 當中斷發生後,...