00 線性地址的管理

1、進程空間的地址劃分
空指針賦值區 0x00000000-0x0000FFFF
用戶模式區 0x00010000-0x7FFEFFFF
64KB禁入區 0x7FFF0000-0x7FFFFFFF
內核 0x80000000-0xFFFFFFFF
特別說明:
<1>線性地址有4G但是不一定都能訪問
<2>所以需要記錄哪些地方分配了
內核空間線性地址通過鏈表將未分配的地址串起來,用戶空間線性地址用一個搜索二叉樹來記錄已分配的空間
下面來看一下它是如何管理用戶空間的線性地址的
WinDbg中隨便找個進程
!process 0 0
在這裏插入圖片描述
查看該進程結構體並找到11C位置VadRoot屬性
dt _EPROCESS 866bd200
在這裏插入圖片描述
這個結點的類型是_MMVAD
kd> dt _MMVAD
nt!_MMVAD
+0x000 StartingVpn : Uint4B //以頁爲單位,這塊內存的起始地址
+0x004 EndingVpn : Uint4B //以頁爲單位,這塊內存的起始地址
+0x008 Parent : Ptr32 _MMVAD
+0x00c LeftChild : Ptr32 _MMVAD
+0x010 RightChild : Ptr32 _MMVAD
+0x014 u : __unnamed //union類型,記錄內存相關屬性 _MMVAD_FLAGS
+0x018 ControlArea : Ptr32 _CONTROL_AREA
+0x01c FirstPrototypePte : Ptr32 _MMPTE
+0x020 LastContiguousPte : Ptr32 _MMPTE
+0x024 u2 : __unnamed
接下來我們看一下我們跟這個進程的內存管理情況,沿着右子樹遍歷幾個結點看看
kd> dt _MMVAD 0x86920868
nt!_MMVAD
+0x000 StartingVpn : 0xbc80
+0x004 EndingVpn : 0xbc9f
+0x008 Parent : (null)
+0x00c LeftChild : 0x86b213d8 _MMVAD
+0x010 RightChild : 0x8671d850 _MMVAD
+0x014 u : __unnamed
+0x018 ControlArea : 0x0a060004 _CONTROL_AREA
+0x01c FirstPrototypePte : 0xee657645 _MMPTE
+0x020 LastContiguousPte : 0x00000001 _MMPTE
+0x024 u2 : __unnamed
kd> dt _MMVAD 0x8671d850
nt!_MMVAD
+0x000 StartingVpn : 0x10000
+0x004 EndingVpn : 0x10079
+0x008 Parent : 0x86920868 _MMVAD
+0x00c LeftChild : 0x8664c670 _MMVAD
+0x010 RightChild : 0x866bd468 _MMVAD
+0x014 u : __unnamed
+0x018 ControlArea : 0x8663e1f8 _CONTROL_AREA
+0x01c FirstPrototypePte : 0xe25f3040 _MMPTE
+0x020 LastContiguousPte : 0xfffffffc _MMPTE
+0x024 u2 : __unnamed
kd> dt _MMVAD 0x866bd468
nt!_MMVAD
+0x000 StartingVpn : 0x770f0
+0x004 EndingVpn : 0x7717a
+0x008 Parent : 0x8671d850 _MMVAD
+0x00c LeftChild : 0x8695cfa8 _MMVAD
+0x010 RightChild : 0x867250a0 _MMVAD
+0x014 u : __unnamed
+0x018 ControlArea : 0x869c4ae8 _CONTROL_AREA
+0x01c FirstPrototypePte : 0xe171cda0 _MMPTE
+0x020 LastContiguousPte : 0xfffffffc _MMPTE
+0x024 u2 : __unnamed
kd> dt _MMVAD 0x867250a0
nt!_MMVAD
+0x000 StartingVpn : 0x7c920
+0x004 EndingVpn : 0x7c9b5
+0x008 Parent : 0x866bd468 _MMVAD
+0x00c LeftChild : 0x868da530 _MMVAD
+0x010 RightChild : 0x86665268 _MMVAD
+0x014 u : __unnamed
+0x018 ControlArea : 0x86bb52b0 _CONTROL_AREA
+0x01c FirstPrototypePte : 0xe14753b0 _MMPTE
+0x020 LastContiguousPte : 0xfffffffc _MMPTE
+0x024 u2 : __unnamed
kd> dt _MMVAD 0x86665268
nt!_MMVAD
+0x000 StartingVpn : 0x7ffa0
+0x004 EndingVpn : 0x7ffd2
+0x008 Parent : 0x867250a0 _MMVAD
+0x00c LeftChild : 0x86a24450 _MMVAD
+0x010 RightChild : 0x8695b190 _MMVAD
+0x014 u : __unnamed
+0x018 ControlArea : 0x86bb22d0 _CONTROL_AREA
+0x01c FirstPrototypePte : 0xe100e5a0 _MMPTE
+0x020 LastContiguousPte : 0xe100e668 _MMPTE
+0x024 u2 : __unnamed
kd> dt _MMVAD 0x8695b190
nt!_MMVAD
+0x000 StartingVpn : 0x7ffd7
+0x004 EndingVpn : 0x7ffd7
+0x008 Parent : 0x86665268 _MMVAD
+0x00c LeftChild : (null)
+0x010 RightChild : 0x86898b48 _MMVAD
+0x014 u : __unnamed
+0x018 ControlArea : (null)
+0x01c FirstPrototypePte : (null)
+0x020 LastContiguousPte : (null)
+0x024 u2 : __unnamed
遍歷到這已經沒有左子樹了。
_MMVAD 的ControlArea指向的是一個_CONTROL_AREA
kd> dt _CONTROL_AREA
nt!_CONTROL_AREA
+0x000 Segment : Ptr32 _SEGMENT
+0x004 DereferenceList : _LIST_ENTRY
+0x00c NumberOfSectionReferences : Uint4B
+0x010 NumberOfPfnReferences : Uint4B
+0x014 NumberOfMappedViews : Uint4B
+0x018 NumberOfSubsections : Uint2B
+0x01a FlushInProgressCount : Uint2B
+0x01c NumberOfUserReferences : Uint4B
+0x020 u : __unnamed
+0x024 FilePointer : Ptr32 _FILE_OBJECT
+0x028 WaitingForDeletion : Ptr32 _EVENT_COUNTER
+0x02c ModifiedWriteCount : Uint2B
+0x02e NumberOfSystemCacheViews : Uint2B
當其FilePointer屬性位NULL則其對應的就是一個物理內存,當其指向一個_FILE_OBJECT結構體時,則對應的是一個映射文件。我們所有內存都只有兩類,一類是自己申請的,一類是通過文件映射的.WinDbg提供了快速遍歷指令!vad 效果如圖:
在這裏插入圖片描述

3、內存屬性
kd> dt _MMVAD_FLAGS
nt!_MMVAD_FLAGS
+0x000 CommitCharge : Pos 0, 19 Bits
+0x000 PhysicalMapping : Pos 19, 1 Bit
+0x000 ImageMap : Pos 20, 1 Bit //1鏡像文件,0其他
+0x000 UserPhysicalPages : Pos 21, 1 Bit
+0x000 NoChange : Pos 22, 1 Bit
+0x000 WriteWatch : Pos 23, 1 Bit
+0x000 Protection : Pos 24, 5 Bits //1.READONLY 2.EXECUTE 3.EXECUTE_READ 4.READWRITE 5.WRITECOPY 6.EXECUTE_READWRITE 7.EXECUTE_WRITECOPY
+0x000 LargePages : Pos 29, 1 Bit
+0x000 MemCommit : Pos 30, 1 Bit
+0x000 PrivateMemory : Pos 31, 1 Bit //1.PrivateMemory 2.Map

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章