日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

解析Winndows 2000/XP物理内存管理

發布時間:2025/3/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解析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)給我提供的思路,才可能有我對此的一些粗淺的理解,再次感謝他。





網友對該文章的評論
網友: ksdgfaijgioajogi(rrr@dfr.com)?發表于: 2004-10-28 16:38:05

我?草!!!??是人學的嗎?!!???
你媽B啊!!!!

弄這么難的干什么?!!??操你媽!
網友: sdf(dsfds)?發表于: 2004-1-17 12:14:26

sdfdsf
網友: 匿名?發表于: 2004-1-9 14:50:41

高深阿!
網友: 匿名?發表于: 2003-3-19 20:21:08

解析Winndows?2000/XP物理內存管理
?
2003-3-17?15:44:06???webcrazy.yeah.net???WebCrazy???閱讀次數:?74?
???物理內存是相對比較緊張的資源,合理利用將是一個操作系統的性能的關鍵。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物理内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。