内存框架是x86框架中最复杂的部分,理解了内存框架基本上就理解了现代计算机体系的大部分内容。
一、地址空间
很多教科书把内存比作是一个大数组,地址是这个数组的索引。与此相似,地址空间则是更大的数组,包含所有可用资源的集合,同样地址也是这个数组的索引。地址空间包含下面两种类型。
1. 物理地址空间
从CPU的角度看,内存和其他硬件设备都是可以使用的资源。这些资源组合在一起,分布在CPU的物理地址空间中。物理地址空间的大小,由CPU实现的物理地址位数所决定,但物理地址位数跟CPU的处理能力(即CPU位数)没有必然的联系。
2.线性地址空间
一台计算机只有一个物理地址空间,但在操作系统的管理下,每个程序都认为自己独占整个计算机的物理地址空间,为了让多个程序能够有效地相互隔离和使用物理地址空间,引入线性地址空间(也称虚拟地址空间)的概念。线性地址空间的大小取决于CPU实现的线性地址位数,在基于80386的计算机系统中,CPU的线性地址空间为4GB。线性地址空间会被映射到某一部分或整个物理地址空间,并通过索引(线性地址)来访问其中的内容。
二、地址
地址是访问地址空间的索引。
1. 逻辑地址
该地址是程序直接使用的地址(x86不能禁用段机制,逻辑地址一直存在)。
比如:
int a = 1;
int * p = &a;
指针变量p存储的即是逻辑地址。
逻辑地址由一个16位的段寄存器(也称段选择符)和一个32位的偏移量(32位平台)构成。 指针变量p实现存储的是逻辑地址的偏移量。
2. 线性地址
又称虚拟地址。是进行逻辑地址转换后形成的地址索引,用于寻址线性地址空间。但CPU未启动分页机制时,线性地址等于物理地址;当CPU启动分页机制时,线性地址还需经过分页地址转换形成物理地址后,CPU才能访问内存硬件和外设。
3. 物理地址
该地址索引物理地址空间。
- 启动分段机制,未启动分页机制:逻辑地址--> (分段地址转换) -->线性地址==物理地址
- 启动分段和分页机制:逻辑地址--> (分段地址转换) -->线性地址-->分页地址转换) -->物理地址
三、内存管理机制
1. 分段机制
分段将内存划分成以起始地址(Base)和长度(limit)描述的块,这些内存块就称为“段”。
分段机制由4个基本部分构成:逻辑地址、段选择寄存器、段描述符和段描述符表。其核心思想是:当程序使用逻辑地址访问内存的某个部分时,CPU通过逻辑地址中的段选择符索引段描述符表以得到该内存对应的段描述符,并检测程序的访问是否合法,如合法,根据段描述符中的基地址将逻辑地址转换成线性地址。
逻辑地址到线性地址的变换过程:
、
2. 分页机制
分页机制的核心思想是通过页表将线性地址转换成物理地址,并配合旁路转换缓冲区(Translation Lookaside Buffer, TLB)来加速地址转换过程。
线性地址和物理地址之间的变换过程:
3. 分段机制和分页机制的区别
- 分页机制会使用大小固定的内存块,而分段管理则使用了大小可变的块来管理内存。
- 分页使用固定大小的块更为适合管理物理内存,分段机制使用大小可变的块更适合处理复杂系统的逻辑分区。
- 段表存储在线性地址空间,而页表则保存在物理地址空间。