• 操作系统学习笔记(三) 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

  • 相关阅读:
    Qt Create or VS 2015 使用 Opencv330 相机静态库链接错误如何解决?
    Qt create 如何构建 ActiveX 控件?
    VB 如何调用 c++ DLL?
    Opencv 330 如何裁剪图片中大的目标?
    Opencv 330 如何進行圖像的旋轉?
    Qt 开发 MS VC 控件终极篇
    Qt 5.9.4 如何静态编译和部署?
    图片理论基础
    iOS平台设置系统状态栏(通知栏、顶部状态栏)样式背景颜色或透明
    jQuery基础
  • 原文地址:https://www.cnblogs.com/itdef/p/5839159.html
Copyright © 2020-2023  润新知