無處不在的頁異常

2022-07-04 19:21:12 字數 2774 閱讀 7984

windows核心分析索引目錄:

無處不在的頁異常

1. 無效pte的情況

之前我們在保護模式中分析了pte的情況,但是其是有效的,如果無效則其資料結構是不同的。

如果要區分是否有效,關鍵是看pte中的p位,如果p位為1,則為有效,否則就為無效,無效分各種情況。

1)磁碟中存在許多個 pagefile.sys檔案,該檔案就是所謂的虛擬記憶體,當記憶體不足時其會存放在pagefile.sys檔案中,並且將pte修改為(a),原來的物理頁被別處使用,

當訪問pte時,遇到這種情況,其會從[1-4]位中找到其所在的pagefile.sys位置,然後將其對映到磁碟上。

2)當程序需要乙個零頁面,其可以直接訪問(b)這種pte格式的記憶體,作業系統發現就會通過缺頁異常為其分配乙個零頁面的,這很方面。

3)當該頁面正在轉移到磁碟上,或從磁碟轉移到記憶體中,就會是(c)這樣子,這個很好理解。

4)最後一種就是未知原因,如果遇到這種情況,就需要檢查vad樹,看看該頁是否在當前的程序中,再做下一步處理,如果能查詢,則分配記憶體,如果不存在,則會報c000005錯誤。

注意:只有在三環才存在這種錯誤,因為在零環是沒有vad樹的,這個很容易理解。

2. __mmpte

__mmpte是乙個聯合體,如下存在幾種pte種類,其有效和各種無效的。

kd> dt _mmpte -r1

nt!_mmpte

+0x000 u                : __unnamed

+0x000 long             : uint4b

+0x000 hard             : _mmpte_hardware

+0x000 flush            : _hardware_pte // 正常使用的pte

+0x000 proto            : _mmpte_prototype // 原型pte

+0x000 soft             : _mmpte_software

+0x000 trans            : _mmpte_transition

+0x000 subsect          : _mmpte_subsection

+0x000 list             : _mmpte_list

1)原型pte的用法

當程序第一次引用乙個已被對映的記憶體區物件的檢視中的頁面中,記憶體管理器利用原型pte中的資訊來填充頁表中實際的pte。

原型pte常用在共享記憶體中,比如對映檔案,共享節區等,所謂原型pte,其本質就是「狀態的描述」,其會幫助修正物理指向。

其原型pte如上圖所示,程序a b共享乙個物理頁面,但該頁面換入虛擬記憶體中,此時程序ab共同指向記憶體段物件的原型pte:

① 當a第一次訪問時,其觸發頁異常錯誤,將頁面載入到記憶體並且a的pte從段物件轉而指向該物理頁p2,並且將段物件中的原型pte也指向p2;

② 此時b也訪問頁面p2,其指向原型pte,當觸發頁異常時,頁異常處理程式發現存在原型pte,其會自動去解析原型pte,發現其指向p2,此時其會將b程序的pte直接指向p2。

如果你理解了這種,你會發現原型pte就是所謂的「記錄狀態」,其為啥在共享中常用呢?因為其多個pte共同指向原型pte,這樣可以提高效率。

如果不用原型pte,則a程序修復完之後還要去b、c、···d共同將頁面置換(注意,不同程序存在自己的頁目錄表基址,即存在自己獨立的pte),而共同指向乙個原型pte,其儲存在mmpfndatabase中。

如下圖,其指向原型pte的指標,其中「原型位」這個概念你一定要明確,現在再來看很好理解了。

2)寫拷貝原理

pte各種屬性為中並沒有寫拷貝的概念,可寫拷貝的頁面,其pte中的w位為0,此時如果強寫會觸發0e號頁異常;

此時其會去從vad中檢視該頁的屬性,發現其是寫拷貝屬性,則重新複製乙份,之後修改其pte,這樣就實現了寫拷貝了。

3.mdl記憶體對映

1)記憶體中存在兩種對映:

① mmiospace,其傳入實體地址,其返回乙個虛擬位址;

② mdl,其傳入乙個虛擬位址,其再幫你對映乙份。

使用mdl就會乙個實體地址存在兩個虛擬位址,如果乙個虛擬位址修改了,就直接更改實體地址了。

2)mdl用法:

①  ioallocatemdl 建立乙個mdl,寫入對映的位址和大小,其mdl是乙個連續的鍊錶資料結構;

②  mmproandlockpages  nochange置為1,防止需要對映的記憶體置換出,否則發生頁面置換,對映時為空則會出現藍屏;

③  mmmaplockedpages 將mdl在記憶體中再對映乙份,在這裡就實現對映,其返回乙個記憶體位址,我們就可以直接對該記憶體位址進行讀寫;

④  mmunmaplockedpages 解除對映,此時就原來的虛擬位址對應實體地址;

⑤  iofreemdl 將該mdl從mdl鍊錶中釋放出去。

其中注意在第③步時才會發生對映,即乙個實體地址存在兩份虛擬位址,mdl只是乙個相關資料結構,驅動中可以常見,我們之後會來分析有關資料結構。

系統無處不在

本書最大的啟示 西方的科學通常是一種不斷的從大到小範圍內進行不停的劃分,當把問題劃分到足夠小的時候就可以解決。但是本書是一種逆向的方式,以整體化和系統化的方式看待問題,尤其是將問題還原到系統中的觀點極其的獨特,有非常高的借鑑意義。系統化思維在自然和社會的方方面面都在發揮著重要的作用。我們在看待某個問...

數學無處不在

數學無處不在 基本資訊 叢書名 數學與人文 出版社 高等教育出版社 isbn 9787040345346 出版日期 2012 年5月 開本 16開 頁碼 1 版次 1 1 所屬分類 數學 更多關於 數學無處不在 內容簡介 數學書籍 本著叢書 讓數學成為國人文化的一部分 的宗旨,我們在本輯向讀者展示 ...

Cache無處不在

本文屬於備忘錄形式的,記錄了最近的一些收穫。在web世界裡,cache是無所不在的。客戶端的瀏覽器會針對訪問的網頁自動的快取一部分的靜態檔案,從而增加瀏覽的速度,這就是我們為什麼會在瀏覽器的臨時資料夾中發現大量莫名其妙檔案的理由。另外isp為了增加使用者的訪問速度,也會在中轉的伺服器中提供大量的快取...