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段页机制在我其他的笔记中有详细介绍)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值