Windows核心原理與實現讀書筆記之異常分發

2021-10-10 19:53:41 字數 2166 閱讀 4034

異常分發

在intel x86 體系結構中,異常也是通過idi(中斷描述符表)分發的。

異常記錄exception_record 定義:

typedef

struct

_exception_record exception_record, *pexception_record;

異常處理例程_kitapxx 如何向kidispatchexception 提供引數資訊。

首先,idt的每個異常處理例程都回在入口處,通過enter_trap 巨集為當前所發生的異常建立起乙個陷阱幀。enter_trap巨集會將異常發生時的主要暫存器存放到棧中,包括非易失的暫存器(ebp,ebx,esi,edi)、段暫存器fs、當預處理器的異常鍊錶(位於kpcr的開頭)、發生異常時的處理器模式(核心或使用者模式)、易失暫存器(eax、ecx、edx)、段暫存器(ds、es、gs),以及一些除錯資料。

處理器在異常(或中斷)發生時的棧,如圖:

函式從3環到0環時的儲存現場

作業系統維護了乙個結構 _ktrap_frame ,在該結構裡儲存了乙個執行緒3環的暫存器的值。每乙個執行緒有乙個該結構體

trap frame

是指中斷、自陷、異常進入核心後,在堆疊上形成的一種資料結構。用來儲存三環的暫存器

_ktrap_frame

陷阱幀定義:

typedef struct _ktrap_frame //trap

現場幀

ktrap_frame, *pktrap_frame;

typedef ktrap_frame *pktrap_frame;

typedef ktrap_frame *pkexception_frame;

windows

利用陷阱幀中的segcs ,即發生異常時的指令所在的段,來確定處理器模式。segcs的0~1位代表了段選擇符的特權級,即異常發生時的當前特權級(cpl)。

kidispatchexception

函式原型

void kidispatchexception (

in pexception_record exceptionrecord,

in pkexception_frame exceptionframe,

in pktrap_frame trapframe,

in kprocessor_mode previousmode,

in boolean firstchance )

exceptionrecord

:用來描述要分發的異常。

exceptionframe

:指向的ktrap_frame結構,用來描述異常發生時的處理器狀態,包括各種通用暫存器、除錯暫存器、段暫存器等。

previousmode

:列舉,用來表示前一種狀態是核心模式還是使用者模式。

firstchance

:表示第幾輪分發。

kidispatchexception

會先呼叫kecontextfromkframes函式,目的是根據trapframe引數指向的ktrap_frame結構產生乙個context結構,以供向偵錯程式和異常處理器函式報告異常時使用。

核心太異常的分發過程,對於第一輪異常kidispatchexception會試圖先通知核心偵錯程式來處理異常,如果沒有處理異常,那麼會呼叫rtldispatchexception,試圖尋找已經註冊的結構化異常處理器(seh)。如果也沒有找到,那麼就會給核心偵錯程式第二次處理的機會。仍返回false的話,就會呼叫kebugcheckex觸發藍屏。

使用者態異常的分發過程,首先,kidispatchexception 會判斷是否傳送給核心偵錯程式,但核心偵錯程式通常不會處理使用者態異常,所以kidispatchexception 會試圖傳送給使用者態偵錯程式,方法是呼叫dbgkforwardexception。如果不成功,kidispatchexception下一步動作是試圖尋找異常處理塊來處理該異常,因為使用者異常傳送在使用者態**中,異常處理塊也是在使用者態**中。所以需要轉到使用者態去執行。如果最終也返回false,那麼就會分發第二輪。

異常分發流程,如圖:

windows核心原理與實現

本文章是作者本人在學習 windows原理與實現 一書時的一些總結和筆記 2.1處理器模式 intelx86處理器 0 最高端特權,cpu處在核心模式,可以訪問當前程序的位址空間和系統空間 3 最低特權,處在使用者模式,只能訪問當前程序的位址空間。2.2記憶體管理 共享的系統位址空間和私有的程序位址...

Windows核心原理與實現之核心載入

在intel x86系統上,windows作業系統獲得控制首先從硬碟的主引導記錄 mbr 開始,windows setup程式在安裝windows時填充mbr 其他的磁碟管理器也可能填充mbr mbr包含 和資料,其 稱為引導 在系統引導時首先獲得控制 mbr中的資料時一張分割槽表,制定了每個分割槽...

《Windows核心原理與實現》終於完成了

windows 核心原理與實現 終於完成了 經過將近兩年的努力,終於完成了 windows 核心原理與實現 一書。2008 年春天,我有了寫一本關於 windows 核心的書的想法,然後聯絡出版社並付諸實施。這就把兩年的業餘時間搭了進去,至少有一半的夜晚遲至 2點才睡覺。按原來的計畫,期望在 200...