中斷和異常
中斷:可遮蔽中斷,在cpu的intr引腳接收的中斷請求,if=1時才允許發生可遮蔽中斷
不可遮蔽中斷,在cpu的nmi輸入腳上接收到,cpu無法關閉不可遮蔽中斷.
異常:cpu檢測的異常被分為3種:
故障,是在已被檢測到異常的指令之前的指令邊界上報告的異常.故障在恢復到允許指令重新啟動狀態時由機器報告.用於故障處理程式的返回位址指向故障的指令,而不是指會故障指令之後的指令.
自陷,自陷是在已被檢測到異常指令之後緊接著的指令邊界上報告的異常.
中止,中止並不總是報告引起的異常的指令位置,並且不允許引起異常的程式重新啟動.中止被用來報告幾種錯誤,例如硬體錯誤和在系統表中有不一致的或非法值.
由程式設計引發的異常.into,int3,bound指令觸發.常稱為軟體中斷.cpu象異常一樣處理它
異常和中斷表
向量號 說明(實) 異常源
0(y,故障) 除法錯 div和idiv指令
1 除錯程式呼叫 任何
2 nmi中斷 不可遮蔽中斷
3(n,自陷) 斷點 int指令
4(n,自陷) 溢位
5(y,故障) bound範圍超出(陣列範圍超出) bound指令
6(y,故障) 無效操作碼 保留的操作碼
7(y,故障) 裝置不可用 esc或wait指令
8(y,中止) 雙故障 中斷表限大小,在處理故障時發生另乙個故障
9 (intel保留,不要用)
10(y,故障) 無效任務狀態段 jmp.call,ret
11(y,故障) 段不存在 改變段的任何指令
12(y,故障) 堆疊異常 堆疊操作超越位址限值
13(y,故障/自陷) 一般保護
14(y,故障) 頁面故障 引起儲存器的任何指令
15 (intel保留,不要用)
16(y,故障) 浮點錯 esc或wait
17(y,故障) 對齊檢查 任何資料引用
18 機器檢查異常
19-31 (intel保留,不要用)
32-255(n,自陷) 可遮蔽中斷(軟中斷)
eflags暫存器的rf標誌用來防止對乙個指令斷點故障多次服務,在每一條指令順利完成時,rf均被cpu清零,除了iret,jmp,call,int這些引起任務切換的指令之後.在第一次試圖執行指令時rf為零,而若試圖在乙個指令斷點或任務其它故障之後重新啟動指令,rf置1.
同時發生多個異常和中斷時的優先順序
(高) 類 說明
1 在上一指令自陷
--斷點
--除錯自陷異常(tf=1,tss中t=1,或資料/io斷點)
2 外部中斷
--nmi中斷
--可遮蔽中斷
3 取下一指令時的故障
--**斷點故障
--**段超越
--預取時的頁故障
4 下一指令解碼時的故障
--非法操作碼
--指令長度》15位元組
--協處理器不可用
5 執行指令時的故障
--一般檢測
--fp錯誤(來自前面的fp指令)
--溢位中斷
--bound超出範圍
--無效tss
--段不存在
--堆疊異常
--一般保護異常
--資料頁故障
--對齊檢查
中斷門和自陷門的區別:
主要區別是它們對if標誌(eflags中)的影響.使用中斷門的中斷清零if,這樣防止了其它中斷干擾當前中斷處理程式.其後面的iret指令把if恢復為保持在堆疊上的eflags寄存的內容.而通過自陷門的中斷不改變if.
中斷過程中堆疊的變化(異常和中斷之後的堆疊禎):
[無特權級改變 [無特權級改變 [特權級改變 [特權級改變
無出錯**] 有出錯**] 無出錯**] 有出錯**]
原eflags 原eflags 不用(來自tss的esp) 不用(來自tss的esp)
原cs 原cs 原ss 原ss
原eip 原eip 原esp 原esp
出錯** 原cs 原eflags
原eip 原cs
原eip
出錯**
出錯**:
格式: 31-16 15-3 2 1 0
保留 選擇符的 ti idt ext
變址值
注:出錯和選擇符相似
1,如果程式的外部事件引起異常,則ext=1
2,如果出錯**的變址值部分引用idt中的門描述符,則idt=1
3,如果idt=0,則ti位指明出錯**引用gdt還是ldt (ti=0?gdt:ldt)
4,3-15位對應選擇符的高位.
異常條件:
下面每項描述將異常分為故障,自陷和中止
故障 --- 儲存cs和eip的內容並指向產生故障的指令
自陷 --- 保持在自陷發生時儲存的cs和eip的內容,指向產生自陷的指令之後將被執行的令.如果在轉移指令時檢測到自陷,則保持的cs和eip是轉移的目標.而不是轉移指令
中止 --- 中止是既不知道引起異常的指令位置,又不允許重新啟動引起異常的程式的那種異常.中止被用來報告嚴重的錯誤.
X86保護模式程式設計總結(6)
中斷和異常 中斷 可遮蔽中斷,在cpu的intr引腳接收的中斷請求,if 1時才允許發生可遮蔽中斷 不可遮蔽中斷,在cpu的nmi輸入腳上接收到,cpu無法關閉不可遮蔽中斷.異常 cpu檢測的異常被分為3種 故障,是在已被檢測到異常的指令之前的指令邊界上報告的異常.故障在恢復到允許指令重新啟動狀態時...
X86保護模式程式設計總結(1)
系統設計的步驟 1,初始化相關硬體.並裝入系統.2,取得並測試相應硬體的引數.並初始化如x387等硬體.3,載入gdt到gdtr 第乙個描述符必須為0,至少需要乙個 段和乙個資料段 4,載入idt到idtr 必須先關中斷,載入完後可開啟 5,設定cr0中pe 1 也可和pg位一起設,並用jmp大跳 ...
X86保護模式程式設計總結(4)
cpu標識 eflage標誌位 8086cpu 第12 15位始終置位 intel286cpu 在實模式下,12 15位始終清除 32位cpu 在實模式下,第15位始終清除,第12 14位具有最後被裝入的值.在保護模式下,第14位具有最後被裝入的值,第15位被清除.第18位 intel486和pen...