windows内核情景分析学习笔记6

来源:互联网 发布:淘宝店铺名字在哪里改 编辑:程序博客网 时间:2024/06/05 18:56

1、用于数据存储的内存区间分类

①全局数据所占空间。由编译器在编译链接时就静态分配好的,与整个进程共存亡。其分配和释放都是不可见、不可为的

②局部数据所占的空间。调用函数时自动从堆栈上动态分配的,其寿命取决于函数的作用域。其分配和释放是隐含的。

③通过malloc一类函数动态分配的内存。其会一直存在,直到通过free一类的函数加以释放(或进程终止运行)。

 

2、内核对用户空间的管理

对于windows来说,其用户空间的虚存地址从0到0x7fffffff,范围是2GB,每个进程都有这么一个2GB的用户空间。

一般来说,真正使用的只有其中很小一部分。所以,凡是不使用的虚存地址区间,就不需要物理映射。

事实上,只有当前正在受到访问的页面才必须映射到物理内存页面,暂时不受到访问的页面都可以映射到外设(硬盘)上的页面交换文件里,待到实际使用时,才倒换回物理内存页面中。

从原理上说,将一个空间中每一个已分配使用的区间作为节点,然后组成一个链表。需要时从头扫描这个链表,就可以知道哪一些区间被使用了。(实际应用中,是组成成一个AVL树)

每个进程的进程控制块中有个指针VadRoot,指向代表着这个用户空间的数据结构。其中有一个指针,指向一颗AVL树,这颗树的节点就是已分配使用的区间信息。其节点定义如下:

这颗以MEMORY_AREA数据结构为节点的AVL树,代表了用户空间。

结构图:

 

3、内核对用户空间的管理的相关函数

有了AVL树,其他操作和应用便接踵而来,最典型的莫过于MmLocateMemoryAreaByAddress()

此函数的作用是给定一个目标地址,如果此目标地址被使用(存在于AVL树中),则返回这个节点。否则,返回NULL。

另一个典型操作是MmFindGap(),此函数的作用是在地址空间中寻找一个给定长度的空闲地址区间。

需要从一个空间中分配一个地址区间时,可以通过MmCreateMemoryArea()在其AVL树种创建一个节点。其函数大致执行步骤是:

①在AVL树中搜索一块指定大小的区域(利用MmFindGap)

②为此区域建立MEMORY_AREA结构

③向AVL树种插入此MEMORY_AREA结构

这里的虚存区间分配并不意味着物理页面的分配,也不意味着页面映射的建立,仅仅是对于虚存地址资源的占用。

 

4、内存管理中的层次

MEMORY_AREA结构中,其成分Data就是一个枚举类型,这个结构可取两种类型,SectionData和VirtualMemoryData,前者代表文件映射区或共享内存区,后者代表一个普通并已分配的内存区间(大部分情况下都是这个)。

VirtualMemoryData唯一的成分是RegionListHead,其值是一个“区块”链表头。

何谓“区块”?

一个已分配的区间指示一个地址连续的范围,却不一定都有映射,也不一定拥有同样的类型和保护模式。而区块则是地址连续、拥有相同类型和保护模式的子区间。

在使用中,一个区间可能包含若干个区块,所以需要一个链表来维护它们。链表的节点类型为_MM_REGION

其定义为:

区块由一组虚存页面组成,这些页面有着相同的保护模式。

综上所述,内存中有着这样的层次:空间、区间、区块、页面,示意图如下:

 

原创粉丝点击