在Win32中看 堆,虚拟内存,内存映射文件,执行文件,页文件 和 物理内存 的区别

在Win32中看 堆,虚拟内存,内存映射文件,执行文件,页文件 和 物理内存 的区别

物理地址

物理内存(RAM)中的地址是物理地址,物理内存容量也就相当于内存条的容量。

线性地址

线性地址也就是虚拟地址。
由于Windows的分页机制的存在,每一段线性地址都会被映射到相应的物理地址,这个单位是页(4KB)
在这里插入图片描述
有人会问了,线性地址到物理地址的映射关系是怎么的来的?
这个是Windows的事了,这个关系由“页表”和”页目录“决定,这个不是这篇文章的主题

虚拟内存

在虚拟内存中使用的是线性地址。
虚拟内存原则上可以很大(受限于磁盘大小)。
上面的线性地址和物理地址的映射图看似线性地址的大小最大只能达到物理内存大小,而实际上虚拟内存的原理简单的来说就是把磁盘中的大小拿来用,但你在程序中却通过线性地址对他们进行读写。
这个的实现办法是通过页文件实现的。在硬盘中,有一个页文件,这个页文件的大小是可以变化的。
如果想要读取的线性地址所对应的数据直接就在物理内存中,那就可以直接读取。
如果想要读取的线性地址所对应的数据在页文件中,Windows就会把一部分物理内存中不常用的数据放回页文件中,再将页文件中想要读取的数据放进物理内存中,然后将线性地址映射到数据再物理内存中的地址,然后数据就可以通过线性地址被访问
在这里插入图片描述

堆是内存中的一块区域,每个程序都会有一个被Windows创建的进程堆(又称作默认堆)
堆其实是抽象于虚拟内存的,底层调用的是虚拟内存的接口(本质上进行的是虚拟内存操作)
在堆中分配内存块相当于是保留了一段线性地址空间并将这段地址提交物理内存(将线程地址映射到了实际的物理内存中)
在这里插入图片描述

内存映射文件

通过内存映射文件,程序在一段线性地址上的读写操作就相当于对这段线性地址所映射的磁盘中的文件的读写,这样子,就不用将磁盘中的文件读入内存的缓冲区来进行读写操作了
内存映射文件是直接将一段线性地址映射到文件中的,并没有被放入物理内存和页文件中

参考

  1. Windows环境下32位汇编语言程序设计 - 罗云彬
  2. MSDN - layered memory management in win32

本文还在这些地方发布了

  1. https://blog.csdn.net/u013289971/article/details/105339458
  2. https://cqp.cc/t/48992