就像Linux系統報panic(恐慌)一樣,Windows系統只有內核態的代碼執行異常才會導致系統藍屏。其實Windows系統是可以選擇忽略錯誤,但Windows認為原本發生在RAM的錯誤,如果不終止,很有可能導致更多的錯誤,且可能影響到Disk存儲,造成數據損壞,因此Windows選擇了藍屏顯示錯誤并終止系統。
藍屏(Window 7系統)
當異常發生在內核態時,系統將捕捉這個異常(由處理器自動跳轉至已注冊的異常處理函數中),并自動調用KeBugCheckEx函數。調用該函數時,傳遞了1個stop code(數字)和四個參數(與stop code相關)。我們平常在藍屏時,在底部看到一行類似的字符串
```
*** STOP:0x000000D1(0xA35DB800,0x0000001C,0x00000000,0x9879C3DD)
```
其實第1個就是stop code,后面是KeBugCheckEx收到的四個參數,第4個參數往往是發生異常的代碼地址。在藍屏頂部還有一個stop code對應文本格式說明,例如“DRIVER_IRQL_NOT_LESS_OR_EQUAL”。
藍屏(Window 10系統)
接下來,我們來看Windows調用KeBugCheckEx時,該函數都做了什么。
當KeBugCheckEx函數被調用時,該函數將停止所有處理器的中斷,然后切換顯示為低分辨率的VGA模式,接著繪制藍色的背景,并顯示stop code和說明信息。最后,它將調用兩個回調集合:
1. 設備驅動通過KeRegisterBugCheckCallback函數注冊的回調函數,以便設備驅動能夠有機會停止設備
2. 設備驅動通過KeRegisterBugCheckReasonCallback函數注冊的回調函數,以便設備驅動能夠將崩潰時的關鍵信息寫到磁盤,形成系統異常dump文件,以便后續的問題分析。這有點類似Android的ANR trace生成機制。
如果知道了系統在藍屏時都執行的操作,后續如果我們需要在藍屏時做一些特殊的操作,就只需要寫個驅動并注冊一個回調函數。比如,有些服務器虛擬化廠商在虛擬機藍屏時,能夠自動截屏,并自動重啟系統,估計就是通過這個功能實現。
相關文章鏈接:VDI桌面虛擬化四大協議—虛擬化魔鬼象限
初識USB攝像頭數據格式
Windows系統架構—內核態部分
被C語言重塑的UNIX——脫胎換骨
C語言“大爆炸”——C++、Objective-C、C Sharp
C語言的誕生——上帝的編程語言
不能忘卻的C語言之父——丹尼斯·里奇
#后期會介紹更多關于Windows, Linux, C語言等相關知識點,以及牛人的工作經驗等相關內容,增加你對IT技術的興趣!
覺得不錯,請點贊、分享或收藏↓↓↓
請關注:IT科研室
作者:Kevin一個不端不裝有夢有趣的原創文字創作與分享者!
本文發布于:2023-02-28 21:05:00,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/167772396098778.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:stop 0x000000d1.doc
本文 PDF 下載地址:stop 0x000000d1.pdf
| 留言與評論(共有 0 條評論) |