• Windows内存管理总结


    Windows内存管理总结

    Windows的内存管理大致可以分为3部分

    1. 对于用户层0x0到0x7fffffff的2g内存的管理
    2. 真实物理内存的管理
    3. 如何将线性地址映射到真实的物理地址

    1.用户层虚拟内存管理

    ​ 在Windows(32位)内核的数据结构中每一个进程都保留自己4G的虚拟内存,借助于intel的分页模式内存管理可以想到通过将不同的物理地址存储到cr3寄存器便可以指定不同的页目录基址,从而将这4G的内存映射到不同的物理内存中。在这样一个前提下如果我作为一个进程,我想要给我自己分配一块内存的前提便是我要知道我想要分配内存的基地址是否已经有对应的物理页映射,这样就必然存在一套管理机制来管理和记录当前进程全部已经分配的线性地址,以防止对同一个线性地址重复分配物理内存。

    ​ 带着上面的疑问进行分析:

    ​ 首先我们知道虚拟内存的最外层的级别是根据进程进行分配的,呢么这个用来记录已经分配的线性地址的数据结构一定是能够关联到一个进程或者说是能够通过进程结构体去找寻到这个数据结构的。

    ​ 内核层的进程数据结构为**_EPROCESS**,在这个结构中有一个字段叫valroot是一个叫做**_MADDRESS_SPACE**结构的指针.

    _MADDRESS_SPACE这个结构中存在一个字段为**_MEMORY_AREA的指针,_MEMORY_AREA**数据结构是一个二叉树节点,其中记录了一块虚拟内存的起始线性地址和结束线性地址以及保护模式等一系列数据。

    ​ 由上述数据结构可以猜测出来,内核中的用户层线性地址的管理便是通过一颗二叉树来记录的,所有的已经被分配或者被保留的内存都分为一块一块的**_MEMORY_AREA**记录在这颗树中。

    ​ 当用户需要分配一块新的内存的时候便会遇到如下几种情况:

    1. baseaddress已经在这颗树中
      1. 所申请的内存大小已经被分配或者被保留过并且大小足够,呢么直接改变他的保护模式即可
      2. 所申请的内存大小已经被分配或者被保留过但是大小不够,则需要紧接着这块内存继续分配直到足够大
    2. baseaddress不再这颗树中
      1. 新建一个**_MEMORY_AREA**节点插入到这个树中即可

    2.物理内存管理

    ​ 上述的线性地址管理只负责记录和管理已经被分配的线性地址空间,呢真是的物理地址是如何管理和记录的呢。

    ​ 首先依旧是先凭借着我们的经验进行猜测:首先是根据intel的分页机制的要求来说真实的物理地址管理的单位一定是以页面为单位的也就是4kb,呢么如果有一个真实的物理地址作为全局变量,这个地址指向一个巨大的数组,这个数组里面的每一个元素都能够记录当前元素所代表的4kb的物理内存和他的状态呢么我们就可以随时通过这个全局变量找到可用的物理地址了。

    ​ Windows的实现其实就跟我们上面分析的是一样的,他的这个数组里面的元素的数据结构是一个叫做**_PHYSICAL_PAGE**的数据结构,只不过又以其他的一系列数据结构来辅助管理这个数组里面的元素罢了。 Windows中又将不同状态下的物理页用一个连表链接起来,这样就可以通过代表不同状态的链表直接找到所想要寻找的物理页面。

    所以可以知道一个物理页的真实分配可以分为如下几个步骤

    1. 到空闲状态的链表中找到一个物理页
    2. 修改他的状态
    3. 将这个物理页链接到其他的链表中

    3.物理内存到虚拟内存的映射实现

    ​ 物理内存到虚拟内存的映射是离不开硬件的支持的,所以Windows中的物理地址到线性地址的映射也如此,他是借助于intel的分页模式来实现的,Windows系统负责建立一个页面映射表这个页面映射表的物理地址存储在cr3中,intel便可以通过这个cr3寄存器和mmu内存管理单元去将一个线性地址转换为物理地址。

    ​ 每个进程都有一个自己的页表,当切换进程时便是切换cr3寄存器里面的值。(x86段页机制在我其他的笔记中有详细介绍)

  • 相关阅读:
    设计模式日常学习(七)
    ROS1 LTS版本安装教程
    AC自动机
    jvm基础学习总结笔记
    # 从浅入深 学习 SpringCloud 微服务架构(三)注册中心 Eureka(1)
    python 脚本 将一个文件夹下的所有文件遍历替换某些内容(将简体变为繁体)
    理解和熟悉递归中的尝试
    C语言第二十弹--求最大公因数
    2023年10月5号
    JAVA工具类匹配重复或者连续的字符和符号
  • 原文地址:https://blog.csdn.net/qq_43147121/article/details/127805338