解析Winndows 2000/XP物理内存管理
生活随笔
收集整理的這篇文章主要介紹了
解析Winndows 2000/XP物理内存管理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
| 解析Winndows 2000/XP物理內存管理 | ||||||||
| ???物理內存是相對比較緊張的資源,合理利用將是一個操作系統的性能的關鍵。Windows?2000/XP內部使用一個稱為頁框數據庫(Page?Frame?Database)的結構用于描述物理內存的狀態。本文將從這一結構入手詳述Windows物理內存的組織與管理。 ????Windows將物理內存按PAGE_SIZE(在x86上,為0x1000字節,即4K)為單位,將其劃分,每一單元在頁框數據庫中均有一項描述其狀態及用途等。頁框數據庫實際上是由這些描述每一頁情況結構的數組。頁框數據庫由內核變量MmPfnDatabase指定,而數據庫中的項數則由MmNumberOfPhysicalPages指定,項數索引叫Page?Frame?Number(PFN)來表示。MmNumberOfPhysicalPages通常略低于系統實際擁有的物理內存頁數,系統在初始化階段保留部分頁面讓操作系統本身使用。需要指出的是頁框數據庫只描述狹義上的物理內存,不包含其他映射的物理設備的內存。 ????Windbg的!pfn命令用于對任一頁內存的狀態及用途等進行分析,如下所示: ????kd>?dd?MmPfnDatabase?l?1 ????80547438??80c00000 ????kd>?!pfn?143 ????????PFN?00000143?at?address?80C01E48 ????????flink???????00000500??blink?/?share?count?00000001??pteaddress?E1085174 ????????reference?count?0001???Cached?????color?0 ????????restore?pte?00B5AC24??containing?page????????0096D8??Active??????P?????? ??????????Shared 《Inside?Windows?2000》中將PFN的各個字段解釋的已經非常清楚了。這里我只是簡要進行說明: flink與blink用于將特定狀態的頁面連成一個鏈表,系統中內核變量MmZeroedPageListHead、MmFreePageListHead、MmStandbyPageListHead、MmModifiedPageListHead、MmModifiedNoWritePageListHead、MmBadPageListHead用于指示這些狀態的頁面的鏈表頭。從這些變量名很容易明白各鏈表的頁面狀態,在Windows中頁框數據庫中共有8個狀態,另兩個為:Active與Transition狀態。這8個狀態由pfn的type(offset:0xd,size:byte)字段中的前3bit指示。 pteaddress是指向這一頁面的pte地址。經過分析,主要有如下三種情況: ????a.?pteaddress為0或0xffffffff,根據pfn指示的狀態,可識別是ZeroedPage或是FreePage。 ????b.?pteaddress為0xC*******,表明這一頁面當前有系統或某一進程獨占,并且在進程或系統工作集中。 c.?pteaddress為0xE*******,說明這是一個prototype?pte,也就是說這個頁面是共享的。詳細請參閱我的《探究Windows?2000/XP原型PTE》。 restore?pte,在《Inside?Windows?2000》中稱為original?pte。其作用是指示這一頁面的back-store位置,即數據在磁盤中某一pagefile或是mapped?file中的位置。譬如在上面提及的情況c中,其一般是指向mapped?file的某一subsection,所以在內部其稱為Subsection?PTE,由MMPTE_SUBSECTION結構定義。而另外一種情況其可能是一個指向pagefile的pte,由MMPTE_SOFTWARE結構定義。這一點,上次我提及時存在錯誤。MMPTE_SUBSECTION的具體bit定義如下: ????Valid????????????:?Pos?0,?1?Bit ????SubsectionAddressLow?:?Pos?1,?4?Bits ????Protection???????:?Pos?5,?5?Bits ????Prototype????????:?Pos?10,?1?Bit ????SubsectionAddressHigh?:?Pos?11,?20?Bits ????WhichPool????????:?Pos?31,?1?Bit 最高位WhichPool是指示這個Subsection位于哪個pool中(NonPagedPool或是PagedPool中),Valid為0,指示這不是一個x86硬件可以識別的pte,由MiDispatchFault分析。由Subsection?pte轉換成Subsection地址的算法我在底下提供的代碼中給出了。 ????這一描述基本闡述了Subsection?PTE的作用,用于定位由PFN所指定的頁面位于相應的Mapped?File的位置。為了更好的解釋好這一過程,《Inside?Windows?2000》中使用了一個框圖來解釋內存管理器內部的這幾個千絲萬縷的聯系,但各個數據結構,如PFN,SEGMENT等等介紹的不夠詳盡,并且之間的轉換算法均沒有提及。下圖是我根據Windows?XP?Professional?Build?2600的情況,重新制作的一幅圖. Windbg提供了一個!memusage命令通過分析subsectin?pte得到系統中各個mapped?file的使用內存情況,底下的代碼,只是詳細的列出了某些頁面由哪些mapped?file使用,并沒有像!memusage有詳細的統計功能,不過通過這一代碼與我先前提供的文章,也能基本上明白上面這幅圖之間復雜關系。 ????/* ???????For?test?purpose,I?define?the?below?constant,but?no?say? ???????MmSubsectionBase?and?MmNonPagedPoolEnd?are?fixed?in? ???????Windows?2000?and?Windows?XP.?They?are?initialized?on?system? ???????boot?phase?by?ntoskrnl?and?rely?on?the?system?physical?memory?size?etc. ????*/ ????#define?WIN2000_2195 ????#ifdef?WINXP_2600? ????#define?MmSubsectionBase?0x80d21000 ????#define?MmNonPagedPoolEnd?0xffbe0000 ????#endif ????#ifdef?WIN2000_2195 ????#define?MmSubsectionBase?0x0 ????#define?MmNonPagedPoolEnd?0xffb7f000 ????#endif ????#define?MmPfnDatabase?0xffb7f000????//Please?redefine?it?on?your?machine. ????#define?MmNumberOfPhysicalPages?0x3f7d??//Please?redefine?it?on?your?machine. ????/* ??????Portion?of?nt!MiGetSubsectionAndProtoFromPte ??????Get?Subsection?from?restore?pte(original?pte)?at?PFN?Database?Entry ??????disasm?by?WebCrazy(tsu00@263.net)?athttp://webcrazy.yeah.net ?????Thanks?to?wuzq(wuzq@legend.com.cn)?for?light! ????*/ ????unsigned?int?MiGetSubsectionAndProtoFromPte(int?pte) ????{ ???????unsigned?int?subaddr; ???????if(pte?<?0){? ??????????subaddr?=?MmSubsectionBase+(((pte?&?0x1e)?<<2)?|??((pte>>4)?&?0x7ffff80))?; ???????}else{ ??????????subaddr?=?MmNonPagedPoolEnd-(((pte?&?0x1e)?<<2)?|??((pte>>4)?&?0xfffff80))?; ???????} ???????return?subaddr; ????} ????/*? ??????I?release?memusage()?to?dump?Control?Area. ??????Only?mapped?file?control?area?were?dump. ??????Please?see?windbg?!memusage?command. ????*/ ????void?memusage() ????{ ?????????unsigned?int?*pfndatabase?=?MmPfnDatabase; ?????????unsigned?int?numberphys?=?MmNumberOfPhysicalPages; ?????????unsigned?int?restorepte,pfn=0,ppte,subsection; ?????????unsigned?char?flag=0; ?????????static?unsigned?int?flagnum[8]; ?????????static?char?*flagdesc[8]= ????????????????{"Zeroed","Free","Standby","Modified","ModNoWrt","Bad","Active","Trans"}; ?????????memset(flagnum,0,sizeof(flagnum)); ?????????for(;pfn<numberphys;pfn++){ ????????????flag?=?*(char?*)((char?*)pfndatabase+0xd); ????????????flag?&=?0x07; ????????????flagnum[flag]++; ????????????pfndatabase+=0x18/0x04; ????????} ????????DbgPrint("/nMemUsage:/n"); ????????for(flag=0;flag<8;flag++) ?????????????DbgPrint("%10s:%04d(%08dK)/n",flagdesc[flag],flagnum[flag],flagnum[flag]*4); ????????pfndatabase?=?MmPfnDatabase; ????????for(pfn=0;pfn<numberphys;pfn++){ ????????????ppte=*((unsigned?int?*)(pfndatabase+0x1)); ????????????restorepte=*((unsigned?int?*)(pfndatabase+0x4)); ????????????flag?=?*(char?*)((char?*)pfndatabase+0xd); ????????????flag?&=?0x07; ????????????if(ppte>=0xE1000000&&ppte<0xF0000000){ ???????????????subsection=MiGetSubsectionAndProtoFromPte(restorepte); ???????????????DbgPrint("pfn:%04X,ppte:%08X,restorepte:%08X,subsection:%08X,ca:%08X, ????????????????????flag:%10s/n",pfn,ppte,restorepte,subsection, ????????????????????MmIsAddressValid((void?*)subsection)?*(unsigned?int?*)subsection: ????????????????????0x11111111,flagdesc[flag]); ????????????} ????????????pfndatabase+=0x18/0x04; ????????} ????} ????本文只是基本上說明了Windows?2000/XP下物理內存的組織管理,對于restore?pte,正向前面介紹的其實他還指向pagefile,未加以敘述,著實因為這部分內容還很多,看我自己學習的進程,我會另行介紹。需要感謝的是wuzq(wuzq@legend.com.cn)給我提供的思路,才可能有我對此的一些粗淺的理解,再次感謝他。 | ||||||||
|
總結
以上是生活随笔為你收集整理的解析Winndows 2000/XP物理内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吴恩达《优化深度神经网络》精炼笔记(1)
- 下一篇: 吴恩达《优化深度神经网络》精炼笔记(3)