X86保護模式程式設計總結(6)

2021-05-23 16:33:55 字數 2924 閱讀 3188

中斷和異常

中斷:可遮蔽中斷,在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...