操作系统学习笔记 windows内存管理
Posted itdef
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统学习笔记 windows内存管理相关的知识,希望对你有一定的参考价值。
//系统物理页面是由 (Page Frame Number Database )简称PFN数据库来进行管理,实际上是一个数组,每个物理页面都对应一个PFN项。
进程的地址空间是通过VAD(Virtual Address Destriptor)管理。每个进程都有一个AVL树来保存这些VAD节点,来记录使用的地址以及属性等。
进程的内存地址属性分为保留和提交,保留即是使用时候才实际分配内存,而提交时需要交割对现空间的,需要分配物理页面的,然后将两者关联起来。
我们从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
以上是关于操作系统学习笔记 windows内存管理的主要内容,如果未能解决你的问题,请参考以下文章