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

猜你喜欢

转载自blog.csdn.net/lifeshave/article/details/87719324
00
今日推荐