標籤:
CPU異常主要分為三類:錯誤類異常,陷阱類異常和終止類異常
1 錯誤類異常 Fault
CPU遇到該類異常後,會先將CS和EIP(當前發生錯誤的指令,而不是下一條指令)壓棧,然後跳到異常處理函數中,執行完成後恢複到原位置重新執行該指令,如果還有錯誤,還會再進。
例如記憶體缺頁異常就是錯誤類異常,CPU遇到缺頁異常時會跳轉到異常處理,將缺少的記憶體頁從實體記憶體中置換回來,再恢複重新執行記憶體訪問指令。
2 陷阱類異常 Trap
CPU遇到該類異常後,會將CS和EIP壓棧,這個EIP就是當前指令的下一條指令的地址,注意的是下一條指令可能不是相鄰的指令,如果導致異常的是跳轉類指令,下一條指令可能會很遠。
我們經常使用的INT 3就是陷阱類異常。
3 終止類異常 Abort
該類異常用於報告嚴重的錯誤,比如硬體錯誤和系統資料表中包含非法值或不一致的狀態等。大多數終止異常可能是由於堆棧操作不當造成的,例如壓棧和出棧不匹配,作業系統會將此類異常當做程式錯誤來處理,終止導致此類異常的程式。
4 異常列表
| 向量號 |
助記符 |
類型 |
描述 |
來源 |
| 0 |
#DE |
錯誤 |
除零錯誤 |
DVI和IDIV指令 |
| 1 |
#DB |
錯誤/陷阱 |
調試異常,用於軟體調試 |
任何代碼或資料引用 |
| 2 |
|
中斷 |
NMI中斷 |
不可屏蔽的外部中斷 |
| 3 |
#BP |
陷阱 |
斷點 |
INT 3指令 |
| 4 |
#OF |
陷阱 |
溢出 |
INTO指令 |
| 5 |
#BR |
錯誤 |
數組越界 |
BOUND指令 |
| 6 |
#UD |
錯誤 |
無效指令(沒有定義的指令) |
UD2指令(奔騰Pro CPU引入此指令)或任何保留的指令 |
| 7 |
#NM |
錯誤 |
數學副處理器不存在或不可用 |
浮點或WAIT/FWAIT指令 |
| 8 |
#DF |
終止 |
雙重錯誤(Double Fault) |
任何可能產生異常的指令、不可屏蔽中斷或可屏蔽中斷 |
| 9 |
#MF |
錯誤 |
向副處理器傳送運算元時檢測到頁錯誤(Page Fault)或段不存在,486及以後整合了副處理器,本錯誤就保留不用了 |
浮點指令 |
| 10 |
#TS |
錯誤 |
無效TSS |
任務切換或訪問TSS |
| 11 |
#NP |
錯誤 |
段不存在 |
載入段寄存器或訪問系統段 |
| 12 |
#SS |
錯誤 |
棧段錯誤 |
棧操作或載入SS寄存器 |
| 13 |
#GP |
錯誤 |
通用/一般保護異常,如果一個操作違反了保護模式下的規定,而且該情況不屬於其他異常,CPU就是認為是該異常 |
任何記憶體引用或保護性檢查 |
| 14 |
#PF |
錯誤 |
頁錯誤 |
任何記憶體引用 |
| 15 |
保留 |
|
|
|
| 16 |
#MF |
錯誤 |
浮點錯誤 |
浮點或WAIT/FWAIT指令 |
| 17 |
#AC |
錯誤 |
對齊檢查 |
對記憶體中資料的引用(486CPU引入) |
| 18 |
#MC |
終止 |
機器檢查(Machine Check) |
錯誤碼和來源與型號有關(奔騰CPU引入) |
| 19 |
#XF |
錯誤 |
SIMD浮點異常 |
SIMD浮點指令(奔騰III CPU引入) |
| 20~31 |
保留 |
|
|
|
| 32~255 |
使用者自訂中斷 |
中斷 |
可屏蔽中斷 |
來自INTR的外部中斷或INT n指令 |
軟體調試——CPU異常列表