操作系统学习笔记(三) windows内存管理

时间:2023-03-09 13:14:40
操作系统学习笔记(三) windows内存管理

//系统物理页面是由 (Page Frame Number Database )简称PFN数据库来进行管理,实际上是一个数组,每个物理页面都对应一个PFN项。

进程的地址空间是通过VAD(Virtual Address Destriptor)管理。每个进程都有一个AVL树来保存这些VAD节点,来记录使用的地址以及属性等。

操作系统学习笔记(三) windows内存管理

进程的内存地址属性分为保留和提交,保留即是使用时候才实际分配内存,而提交时需要交割对现空间的,需要分配物理页面的,然后将两者关联起来。

我们从NtAllocateVirtualMemory函数入手

首先检查函数参数的正确性,并且对涉及到的地址进行地址对齐,再计算实际需要的空间长度。

接下来,获取需要操作的进程对象和进程对象的地址AVL树。

如果改地址空间已经分配,在地址AVL树中找到,那么根据此次调用函数的参数设置地址空间的属性,进行同属性空间的分割合并。

如果空间未在地址AVL树中找到合适的或者地址未指定,那么就调用MmCreateMemoryArea()分配一块空间并且插入到AVL树中。

创建结束。

//================================================

//内存映射对象  section object

进程的用户空间映射到物理页面,一般来说只属于该进程。但是一个物理页面也可以映射到多个进程中,供多个进程共享访问。使用内存映射对象可以达到这个目的。

而使用内存映射对象将文件映射到内存地址空间中,像访问内存一样访问文件,既简化文件读写操作,也提升了性能。

NtCreateSection()->MmCreateSection()

根据参数的不同确认是映射系统页面文件,或者是映射映像文件,或者是映射数据文件。

以映射数据文件为例,创建section对象,调用ObReferenceObjectByHandle()获取文件对象,使用IoQueryFileInformation()获取文件信息,映射区大小和文件大小必须符合。

创建一个映射段Segment,配合Segment的参数,说明此段对应文件中起始偏移空间。

(不同于映像文件,数据文件只有一个段Segment),创建结束。

//================================================

创建内存映射对象后,需要调用NtMapViewOfSection()将内存映射映射到进程中。

使用ObReferenceObjectByHandle()获取Section对象 Process对象

->MmMapViewOfSection()->MmMapViewOfSegment();映射映射区中的段

创建进程内存空间 填充参数 并且插入到进程的地址AVL树中.

//==============================================

这里记录一个windows驱动的博客 由于作者禁止任何形式的转载 所以仅仅写下地址

学习的时候切过去看

http://www.cnblogs.com/gussing/archive/2011/01/18/1938140.html