www.138139.cn

返回总目录 上一页 目录页 下一页

玩玩Win2k内存篇 VAD


    程序中我们可以使用 VirtualAlloc 在用户地址空间(4G地址空间中的低2G)中申请(保留或者提交)指定地址和大小的一段地址空间。那么系统如何知道指定的这段地址空间是不是已经被分配(保留或者提交)。对于指定地址空间是否已经被提交了物理内存,可以通过页目录和页表来判断,不过这样做很麻烦。而对于指定地址空间是否已经被保留,通过页目录和页表没有办法判断。Win2k 中使用 VAD 来解决这个问题。
VAD 是 virtual address descriptor 的缩写,即 虚拟地址描述符。一个VAD保存一段被分配地址空间的信息,所有VAD组成一个二叉排序树来描述用户地址空间的情况。每个进程有自己的用户地址空间,所以每个进程也有自己的VAD二叉排序树。VAD二叉排序树的根的地址保存在进程结构 EPROCESS 中。对于 Win2k build 2195 来说,VadRoot 在 EPROCESS 偏移 +194 处。




二叉排序树是一棵二叉树,每个节点最多有左右两个子树。左子树上的所有节点的值均小于它的根节点的值,右子树上所有节点的值均大于它的根节点的值。使用二叉排序树是为了保证查找速度。




VAD 结构定义如下




typedef struct _VAD_HEADER {
/*00*/ PVOID StartVPN;
/*04*/ PVOID EndVPN;
/*08*/ _VAD_HEADER* ParentLink;
/*0C*/ _VAD_HEADER* LeftLink;
/*10*/ _VAD_HEADER* RightLink;
/*14*/ ULONG CommitCharge : 20;
/*14*/ ULONG Flags : 12;
/*18*/ PVOID ControlArea;
/*1C*/ PVOID FirstProtoPte;
/*20*/ PVOID LastPTE;
/*24*/ ULONG Unknown;
/*28*/ LIST_ENTRY Secured

址163164.cn 微信1631640 QQ3149886

返回总目录 上一页 目录页 下一页