文章目录
前言
我们都知道,CPU执行程序、处理数据都需要和内存打交道,这个打交道的方式那就是内存地址。本章则是探讨虚拟地址和物理地址之间的关系和转换机制,内存资源正是通过这些机制来管理。
一、虚拟地址与物理地址
1.1虚拟地址
虚拟地址,正如其名,这个地址是虚拟的,它只是逻辑上存在的一个数据值。
那么这个地址是谁产生的呢?那就是链接器。当开发软件经过编译步骤后,就需要链接成可执行文件才可以运行。而链接器的主要工作就是把多个代码模块组装在一起,并解决模块之间的引用,即处理程序代码间的地址引用,形成程序运行的静态内存空间视图。只不过这个地址是虚拟而统一的,而根据操作系统的不同,这个虚拟地址空间的定义也许不同,应用软件开发人员无需关心,由开发工具链给自动处理了。
虚拟内存实际上是存储器地址空间抽象的一种实现。从进程的角度看起来就好像自己独占了整个内存,链接器链接编译产物的时候只需要从0地址开始做变量和函数地址的替换,不需要关心自己是否会把其他进程的内存单元给污染。
1.2物理地址
物理地址,字面意思,这个地址是真实存在的,是内存中真正的地址。它在逻辑上只是一个数据,但这个数据可以被地址译码器等电子器件变成电子信号,这可以让地址总线查找到真正的存储单元。
1.3虚拟地址到物理地址的转换
明白了虚拟地址和物理地址后,我们发现如果想要程序正常执行,那就是必须要将虚拟地址转换成物理地址。
要实现转换,用软件方式太低效,用硬件方式没有灵活性,最终采用软硬件结合的方式实现,那就是MMU(内存管理单元)。MMU可以接受软件给出的地址对应关系数据,进行地址转换。
逻辑上的MMU工作原理框架图如下:
上图中展示了 MMU 通过地址关系转换表,将 0x80000~0x84000 的虚拟地址空间转换成 0x10000~0x14000 的物理地址空间,而地址关系转换表本身则是放物理内存中的。
如果是虚拟地址一一对应物理地址,那么物理地址就会很快用完。但如果采用虚拟段基址一一对应物理段基址,因为段长度各不相同,所以依然不可取。最终采取一个折中方案。即把虚拟地址空间和物理地址空间都分成同等大小的块,也称为页,按照虚拟页和物理页进行转换。根据软件配置不同,这个页的大小可以设置为 4KB、2MB、4MB、1GB,这样就进入了现代内存管理模式——分页模型。
分页模型框架如下图:
上图可看出,一个虚拟页可以对应到一个物理页,由于页大小一经配置就是固定的,所以在地址关系转换表中,只要存放虚拟页地址对应的物理页地址就行了。
二、MMU
2.1什么是MMU?
MMU即内存管理单元,是用硬件电路逻辑实现的一个地址转换器件,它负责接受虚拟地址和地址关系转换表,以及输出物理地址。
根据实现方式的不同,MMU 可以是独立的芯片,也可以是集成在其它芯片内部的,比如集成在 CPU 内部,x86、ARM 系列的 CPU 就是将 MMU 集成在 CPU 核心中的。
x86 CPU 要想开启 MMU,就必须先开启保护模式或者长模式,实模式下是不能开启 MMU 的。
由于保护模式的内存模型是分段模型,它并不适合于 MMU 的分页模型,所以我们要使用保护模式的平坦模式,这样就绕过了分段模型。