![第2324講windows內(nèi)存管理基礎_第1頁](http://file4.renrendoc.com/view/6282f7c55cefbca7f2174536a08ac5d5/6282f7c55cefbca7f2174536a08ac5d51.gif)
![第2324講windows內(nèi)存管理基礎_第2頁](http://file4.renrendoc.com/view/6282f7c55cefbca7f2174536a08ac5d5/6282f7c55cefbca7f2174536a08ac5d52.gif)
![第2324講windows內(nèi)存管理基礎_第3頁](http://file4.renrendoc.com/view/6282f7c55cefbca7f2174536a08ac5d5/6282f7c55cefbca7f2174536a08ac5d53.gif)
![第2324講windows內(nèi)存管理基礎_第4頁](http://file4.renrendoc.com/view/6282f7c55cefbca7f2174536a08ac5d5/6282f7c55cefbca7f2174536a08ac5d54.gif)
![第2324講windows內(nèi)存管理基礎_第5頁](http://file4.renrendoc.com/view/6282f7c55cefbca7f2174536a08ac5d5/6282f7c55cefbca7f2174536a08ac5d55.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
中科研CASoft軟件工程師培訓講義Game
Master游戲修改工具第12講Windows內(nèi)存管理基礎(2)中科天地軟件人才培訓中心Created
by本講重點提要¤
本講和上一講“Windows內(nèi)存管理基礎
(1)”對Windows內(nèi)存管理的基本原理做了簡單的介紹,本講中沒有對相關(guān)的具體編程技術(shù)做講解,但本講的內(nèi)容對于今后編程中(包括內(nèi)核編程)可能遇到的問題會有很大的幫助。目錄¤
系統(tǒng)內(nèi)存交換區(qū)¤
地址轉(zhuǎn)換¤
頁錯誤處理¤
虛擬地址描述符系統(tǒng)內(nèi)存交換區(qū)¤在系統(tǒng)初始化階段,內(nèi)存管理器將創(chuàng)建兩個可以動態(tài)調(diào)整大小的內(nèi)存交互區(qū),核心態(tài)組件使用這兩個內(nèi)存交換區(qū)分配系統(tǒng)內(nèi)存:非頁交換區(qū)(NonPaged
Pool):由系統(tǒng)虛擬地址的范圍組成,在任何時候都要保證它們駐留在物理內(nèi)存中,這樣就可以在不發(fā)生頁面調(diào)度I/O的情況下從任何地址空間訪問它們。頁交換區(qū)(PagedPool):在系統(tǒng)空間中的虛擬內(nèi)存區(qū)域,它能夠被頁入和頁出系統(tǒng)進程的工作集。因為這種靈活性,就不能保證系統(tǒng)已分頁部分中的地址不會引起頁面錯誤。由于這個原因,在中斷請求級(IRQL)的Dispatch/DPC級或高于該級時,被訪問的數(shù)據(jù)結(jié)構(gòu)必須從非頁交換區(qū)分配。系統(tǒng)內(nèi)存交換區(qū)¤這兩塊內(nèi)存交換區(qū)都位于地址空間的系統(tǒng)部分,并且在每一個進程中都被映射到相同的虛擬地址。執(zhí)行體提供了從這些交換區(qū)中分配和回收內(nèi)存的例程?!?/p>
有兩種類型的非頁交換區(qū):一種是在通常情況下使用的另一種較小的交換區(qū)(四個頁面)被保留在緊急情況下使用(當非頁交換區(qū)已滿并且調(diào)用程序又不能容忍失敗時)。內(nèi)核函數(shù)ExAllocatePool的第一個參數(shù)用于指定內(nèi)存交換區(qū)的類型,該參數(shù)的可取值NonPagedPoolMustSucceed用于支持這里提到的“不能容忍失敗”的情況。更詳細的內(nèi)容,可參閱WindowsNTDDK的相關(guān)內(nèi)容。系統(tǒng)內(nèi)存交換區(qū)¤對于頁交換區(qū),單處理器系統(tǒng)有兩個頁交換區(qū),多處理器系統(tǒng)有四個。一個以上的頁交換區(qū)減少了在同步調(diào)用交換區(qū)例程時發(fā)生系統(tǒng)代碼堵塞的頻率?!?/p>
頁交換區(qū)和非頁交換區(qū)會自動增加到在系統(tǒng)引導時計
算的系統(tǒng)定義的最大值。這些交換區(qū)的初始大小也是
在系統(tǒng)初始化時計算的,并且它們依賴于內(nèi)存的大小?!杩梢酝ㄟ^修改注冊表來更改頁交換區(qū)和非頁交換區(qū)的初始大小,注冊表鍵:
HKLM\SYSTEM\CurrentControlSet\Control\SessionManager\Memory
Management\包含了PagedPoolSize和NonPagedPoolSize等值。系統(tǒng)內(nèi)存交換區(qū)¤
另外,Windows還提供一種叫做“后備列表”(look-aside
lists,有時也叫做“旁視列表”)的快速內(nèi)存分配機制。交換區(qū)和后備列表的基本區(qū)別在于:常規(guī)交換區(qū)分配可以改變大小,而后備列表只包含固定大小的塊?!?/p>
后備列表可以是分頁的或非分頁的,因此它能從頁交換區(qū)和非頁交換區(qū)進行分配。使用后備列表的情況下,由于不必搜尋適合不同分配大小的空閑內(nèi)存(除非后備列表空了),所以后備列表將執(zhí)行的更快。系統(tǒng)內(nèi)存交換區(qū)¤
在默認情況下,系統(tǒng)初始化時將創(chuàng)建8個非頁交換區(qū)和8個頁交換區(qū),分配的大小為(32~256)×32字節(jié)。執(zhí)行體組件和設備驅(qū)動程序能夠創(chuàng)建與頻繁分配的數(shù)據(jù)結(jié)構(gòu)大小相匹配的后備列表?!?/p>
關(guān)于創(chuàng)建、刪除和使用后備列表的詳細信息,請參閱DDK文檔。地址轉(zhuǎn)換¤
前面我們介紹過Windows怎樣組織32位虛地址空間,現(xiàn)在我們介紹Windows是怎樣把這些地址空間映射到物理頁面的。我們將描述在這種地址轉(zhuǎn)換不能解析到
一個物理內(nèi)存地址時會發(fā)生什么(頁面
調(diào)度),并將解釋Windows如何通過工
作集和頁幀數(shù)據(jù)庫來管理物理內(nèi)存。地址轉(zhuǎn)換¤用戶應用程序引用32位虛擬地址,CPU利用內(nèi)存管理器創(chuàng)建和維護的數(shù)據(jù)結(jié)構(gòu)把虛擬地址轉(zhuǎn)換為物理地址。例如,下圖顯示了將三個連續(xù)的虛擬頁面映射到三個不連續(xù)的物理頁面上。地址轉(zhuǎn)換¤
正如上圖中所看到的那樣,虛擬頁面地址并不是直接映射到物理頁面地址,而是通過圖中虛線連接的“頁表項”(page
table
entry,PTE)進行地址轉(zhuǎn)換的。在PTE中,包含了虛擬地址和并映射到的物理地址信息?!?/p>
下面我們介紹Windows是怎樣實現(xiàn)這種映射的。地址轉(zhuǎn)換¤
轉(zhuǎn)換虛擬地址Windows使用二級頁表結(jié)構(gòu)將虛擬地址轉(zhuǎn)換為物
理地址。32位的虛擬地址可以解釋為三個分離的組成
部分:頁目錄索引、頁表索引和字節(jié)索引,它們被用
來作為進入描述頁面映射的結(jié)構(gòu)的索引,如下圖所示:地址轉(zhuǎn)換¤
x86和Alpha操作系統(tǒng)平臺之間字段寬度的不同是由每個平臺的頁面大小規(guī)定的。如上圖的情況,x86系統(tǒng)中的字節(jié)索引為12位,因為頁面大小是4096字節(jié)(212=4096)。Alpha系統(tǒng)中的字節(jié)索引為13位,因為其頁面大小是8192字節(jié)(213=8192)?!?/p>
“頁目錄索引”(pagedirectoryindex)被用來定位頁面,在頁表中虛擬地址的PTE已經(jīng)被定位?!绊摫硭饕保╬agetableindex)被用來定位PTE,PTE包含了虛擬地址和并映射到的物理地址?!白止?jié)索引”(byteindex)被用于在該物理頁面內(nèi)尋找正確的地址。地址轉(zhuǎn)換¤下圖顯示了上述三個數(shù)值之間的相互關(guān)系和把虛擬地址映射到物理地址的方法。地址轉(zhuǎn)換¤
以下是轉(zhuǎn)換一個虛擬地址的基本步驟:內(nèi)存管理器硬件定位用于當前進程的頁目錄。在每個進程的描述表切換發(fā)生時,一般是通過操作系統(tǒng)設置一個專用的CPU寄存器來告訴硬件新進程的頁目錄的地址。頁目錄索引被用來定位頁目錄項,頁目錄項描述了映射虛擬地址時需要的頁表位置。頁表索引用來定位PTE,PTE描述了虛擬頁面的位置。PTE用來定位頁面。如果PTE指向的一個頁面無效,則內(nèi)存管理器故障處理程序?qū)⒍ㄎ豁撁娌⒃噲D使頁面有效,如果仍然不能使頁面有效,故障處理程序?qū)a(chǎn)生一個訪問侵犯或者錯誤檢查。稍后的頁錯誤處理部分將介紹該情況。當PTE指向的頁面有效時,字節(jié)索引就被用來定位在物理頁面內(nèi)所需數(shù)據(jù)的地址。地址轉(zhuǎn)換下面對頁目錄、頁表和PTE做進一步的介紹。1.
頁目錄:每個進程都有一個單獨的“頁目錄”(pagedirectory),它是內(nèi)存管理器創(chuàng)建的一個頁面,用于映射該進程的所有頁表的位置。進程頁目錄的物理地址存儲在核心進程(KPROCESS)塊中,同樣,它也被虛擬地映射到x86系統(tǒng)中的0xC0300000地址上,這是因為運行在核心態(tài)的代碼都是引用虛擬地址,而不是物理地址。地址轉(zhuǎn)換CPU之所以知道頁目錄頁面的位置是因為在CPU中有一個特殊的寄存器(x86系統(tǒng)中是
CR3),它由操作系統(tǒng)加載,其中包含了頁目錄的物理地址。頁目錄由頁目錄項(page
directory
entry,PDE)構(gòu)成。每一個PDE的長度是4個字節(jié),它描述了所屬進程的所有可能的頁表的位置和狀態(tài)。在x86系統(tǒng)中,描述全部4GB的虛擬地址空間需要1024個頁表。映射這些頁表的進程頁目錄包括1024個PDE。這樣一來,頁目錄索引就要達到10個二進制位寬(212=1024)。地址轉(zhuǎn)換2.
進程和系統(tǒng)頁表在頁面內(nèi)用字節(jié)偏移量來引用一個字節(jié)之前,
CPU首先需要能夠查找到包含所要求數(shù)據(jù)字節(jié)的頁面。要做到這一點,操作系統(tǒng)就要構(gòu)造包含映射信息的另一個內(nèi)存頁面,該頁面包含查找含有所需數(shù)據(jù)的頁面所需要的映射信息。這個含有映射信息的頁面叫做“頁表”(page
table)。因為Windows為每一個進程都提供一個專用的地址空間,每一進程都有其自身的進程頁表集以映射其專用的地址空間,因此每一個進程的映射情況都是不相同的。地址轉(zhuǎn)換¤
然而,頁表描述的共享系統(tǒng)空間可以被全部進程共享。當創(chuàng)建一個進程時,系統(tǒng)空間頁目錄項被初始化為指向現(xiàn)有的系統(tǒng)頁表?!?/p>
注意:并不是所有的進程都有相同的系統(tǒng)空間視圖?!?/p>
例如,如果頁交換區(qū)擴展請求分配一個新的系統(tǒng)所頁表,這時內(nèi)存管理器并不會更新所有的進程頁目錄以指向新的系統(tǒng)頁表,而是哪個進程引用了新的虛擬地址時,內(nèi)存管理器才更新該進程的頁目錄。下圖顯示了這一情況:地址轉(zhuǎn)換地址轉(zhuǎn)換¤
這樣一來,當引用頁交換區(qū),而它實際上是駐留在物理內(nèi)存中時,將引發(fā)一個頁面錯誤(page
fault),因為它的進程頁目錄仍沒有指向描述交換區(qū)新區(qū)域的系統(tǒng)頁表?!?/p>
但訪問非頁交換區(qū)時,將不會引發(fā)頁面錯誤,即使非頁交換區(qū)也進行了擴展。這是因為Windows在系統(tǒng)初始化時為非頁交換區(qū)建立了足夠的系統(tǒng)頁表。地址轉(zhuǎn)換3.
頁表項如前所述,頁表由一個頁表項(PTE)數(shù)組構(gòu)成。有效的PTE中有兩個主要字段:包含數(shù)據(jù)的物理頁面的頁幀號碼(PFN,
pageframe
number)或在內(nèi)存中的某個頁面的物理地址的頁幀號碼以及一些描述頁面狀態(tài)和保護的標志。如下圖所示:地址轉(zhuǎn)換地址轉(zhuǎn)換¤
上圖顯示的PTE格式中標注為保留(Reserved)的字段只在PTE無效時使用,下圖顯示了PTE格式中各個標志的含義,更詳細的說明請參閱《Inside
Windows
2000,
Third
Edition》。地址轉(zhuǎn)換¤
頁面內(nèi)的字節(jié)一旦內(nèi)存管理器找到了所需要的物理頁面,內(nèi)存管理器就會在此頁面內(nèi)查找所需要的數(shù)據(jù)。這里就是引入字節(jié)索引字段的地方,字節(jié)索引告訴CPU希望引用頁面中哪一個字節(jié)的數(shù)據(jù)。在x86系統(tǒng)中,字節(jié)索引的寬度是12,因此訪問一個頁面允許最多引用4096個數(shù)據(jù)字節(jié)。地址轉(zhuǎn)換¤
轉(zhuǎn)換后備緩沖區(qū)前面介紹的地址轉(zhuǎn)換每次都要進行兩項查找:查找正確的頁表是否在頁目錄中,其次查找正確的項是否在頁表中。由于在每次引用虛擬地址時進行這兩項內(nèi)存查找會嚴重影響系統(tǒng)性能,因此大多數(shù)的CPU都會對地址轉(zhuǎn)換使用高速緩存,因此重復訪問同一個地址就不需要重新轉(zhuǎn)換。這里我們先對地址轉(zhuǎn)換的高速緩存做簡單說明,關(guān)于高速緩存的更多內(nèi)容,在后面的“Windows高速緩存”中一講中會做介紹。地址轉(zhuǎn)換¤
x86和Alpha系統(tǒng)中的處理器都能以一種聯(lián)合內(nèi)存隊列的形式提供一種稱為“轉(zhuǎn)換后備緩沖區(qū)”(translation
look-asidebuffer,TLB)的高速緩存機制。TLB是矢量隊列,它的單元可以被同步的讀出并和目標值比較。在使用TLB時,矢量中包含大多數(shù)最近使用過頁面的從虛擬地址到物理頁面的映射和應用于每一個頁面的頁面保護類型。頁錯誤處理¤
前面一節(jié)介紹了當PTE有效時如何解決地址轉(zhuǎn)換的情況。如果清除了PTE的有效位,就表明所需的頁面因某種原因?qū)Υ诉M程當前是不可訪問的?!?/p>
對無效頁面的引用稱為頁錯誤(pagefault)。內(nèi)核陷阱處理程序調(diào)度這種錯誤到內(nèi)存管理器錯誤處理程序中解決。這個例程運行在引起錯誤的線程描述表中,并負責嘗試解決這個錯誤或產(chǎn)生適當?shù)漠惓?。頁錯誤處理¤
注意,這里所說的“頁錯誤”并不是指一般意義上的程序錯誤,而是內(nèi)存調(diào)度的一種常見情況,它可能是正常的調(diào)度,也可能就是一般意義上的程序錯誤造成的?!?/p>
下面介紹頁錯誤產(chǎn)生的原因和處理的結(jié)果:錯誤原因處理結(jié)果訪問一個沒有駐留在內(nèi)存中但在磁盤上的頁面文件或映射文件中的頁面。分配一個物理頁面,并將所需的頁面從磁盤上讀取到工作集中。訪問一個在備用或更改列表中的頁面。將頁面轉(zhuǎn)換到進程或系統(tǒng)工作集中。頁錯誤處理錯誤原因處理結(jié)果訪問一個沒有占用存儲器的頁面,例如:保留的地址空間或未分配的地址空間。訪問侵犯。從用戶態(tài)訪問一個只能在核心態(tài)下被訪問的頁面。訪問侵犯。寫入一個只讀的頁面訪問侵犯。訪問一個請求零頁面添加一個由零填充的頁面到進程工作集中寫入一個保護頁面保護頁侵犯(如果引用用戶態(tài)堆棧,將執(zhí)行自動堆棧擴展)寫入一個寫時復制頁面制作進程專用頁面的副本,并替代在進程或系統(tǒng)工作集中的原始頁面頁錯誤處理錯誤原因處理結(jié)果引用一個在系統(tǒng)空間中有效但不在進程頁目錄中的頁面(例如,在創(chuàng)建進程頁目錄后頁交換區(qū)被擴展)從主系統(tǒng)目錄結(jié)構(gòu)復制頁目錄項而放棄異常(這個錯誤從來不會被硬件指出)在多處理器系統(tǒng)上,寫入一個有效但尚未寫入的頁面在PTE中設置頁面重寫標志¤
關(guān)于頁錯誤處理更詳細的說明請參閱《InsideWindows
2000,
Third
Edition》。虛擬地址描述符¤內(nèi)存管理器使用按需頁面調(diào)度算法來了解何時將頁面調(diào)入內(nèi)存,并等待直到一些線程引用了一個地址并引發(fā)了一個頁錯誤才從磁盤中讀回頁面。象寫時復制一樣,按需頁面調(diào)度也是一種怠惰計算形式,即直到需要時它才去執(zhí)行任務?!?/p>
內(nèi)存管理器使用怠惰計算不僅把頁面帶進內(nèi)存,而且
構(gòu)造描述新頁面所需的頁表。例如,當一個線程提交
了大量的虛擬內(nèi)存時,內(nèi)存管理器并不立即構(gòu)造訪問
整個內(nèi)存區(qū)域所需的頁表,而是
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 設備維護助理工作總結(jié)
- XXX電子科技有限公司員工安全手冊(安全操作規(guī)程)
- 2025-2030全球汽車主動夜視系統(tǒng)行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國臺式振動臺行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球監(jiān)視雷達系統(tǒng)行業(yè)調(diào)研及趨勢分析報告
- 2025-2030全球碳納米粉行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國三重四級桿液質(zhì)聯(lián)用儀行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球DRM數(shù)字版權(quán)保護技術(shù)行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國細胞活力檢測試劑盒行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球可重復使用墊料氣囊行業(yè)調(diào)研及趨勢分析報告
- 走新型城鎮(zhèn)化道路-實現(xiàn)湘潭城鄉(xiāng)一體化發(fā)展
- 江蘇中國中煤能源集團有限公司江蘇分公司2025屆高校畢業(yè)生第二次招聘6人筆試歷年參考題庫附帶答案詳解
- 【語文】第23課《“蛟龍”探?!氛n件 2024-2025學年統(tǒng)編版語文七年級下冊
- 2024版冷水機組安裝合同
- 北師版七年級數(shù)學下冊第二章測試題及答案
- GB/T 21369-2024火力發(fā)電企業(yè)能源計量器具配備和管理要求
- 2025年全體員工安全意識及安全知識培訓
- 2025警察公安派出所年終總結(jié)工作匯報
- 機動車檢測站新?lián)Q版20241124質(zhì)量管理手冊
- 智研咨詢發(fā)布-2025年中國少兒編程行業(yè)市場競爭格局、行業(yè)政策及需求規(guī)模預測報告
- 湘教版七年級上冊數(shù)學期末考試試卷帶答案
評論
0/150
提交評論