跟前博文 Linux 内核学习笔记:预备知识之“寄存器模型”一样,该篇博文也会从实模式和保护模式两个方面来阐述存储器模型,不过以后者为主。
博文最后有一大图,详细说明了虚拟地址到物理地址映射的全过程!
《32 位微型计算机接口技术及应用》和《深入理解计算机系统》将作为主要参考资料。
实模式下存储器模型
32 位的微处理器在实模式下,支持寻址1MB
存储器,即存储器从 00000H 到 FFFFFH 地址编号的空间。其中,00000H~003FFH 区域专门用于存放中断向量表
;00400H~FFFFFH 则用作通用区域。
实模式下的逻辑地址由段基址和偏移量两部分组成。默认的“段+偏移”寻址组合如下图所示:
逻辑地址的段基地址和偏移量都是 16 位的,但是,实际读/写存储器时使用的物理地址是 20 位的,所以微处理器需要生成 20 位的物理地址(存储器地址),以便访问存储器内的单元。物理地址的计算公式如下:物理地址 = 段寄存器的值 * 16 + 偏移量
保护模式下存储器模型
保护模式下存储器寻址方案
在保护模式下,仍然采用“段+偏移”的寻址方案,只是原来存放段基地址的段寄存器(仍然是 16 位)现在用于存放段选择子,由该选择子选择描述符表内的一个描述符,然后从该描述符获得段基址。默认的“段+偏移”寻址组合如下图所示:
由选择子得到的段基址为 32 位(允许将该段定义到存储器的任一位置),加上偏移量的 32 位就是线性地址:线性地址 = 段基地址(32 位) + 偏移量(32 位)
如果不分页,则这个线性地址就是物理地址;如果采用分页机制,还需将该线性地址经分页转换为物理地址。
保护模式下的分页管理机制
页
页是实现分页管理机制的基础。只有保护模式才有分页机制,实模式没有。
每个页大小为 4KB。其实,一个页就是一段存储大小为 4KB 的段,跟我们之前接触的段没有本质的区别,只是分页机制能够方便内存的管理而已。
页有 3 个属性:
- 页基址:
- 表示页号:20 位长,可寻址 1M 个页号;
- 或表示页的物理地址(跟页号等价):页可以定位在从 4KB 为边界开始的任何线性空间。
- 页长度:4KB,用 12 位表示。
- 页属性:描述页的保护属性。它是对页的访问是否被允许,以及对页的访问的合法性进行检查的主要依据。
页表目录及页表
注意:页表跟页不一样。
- 页表目录:存放
页表目录项(指向页表,包含页表的物理地址,即页表号)
- 页表:存放
页表项(指向页,包含页的物理地址,即页号)
页表目录项和页表项的格式一样,如下:
因此,页表目录和页表所能存放的表项数为:4KB/4B = 1024 个
。
两级页表所能寻址的内存大小为:1024 * 1024 * 4KB = 4GB
。
另外,U/S 和 R/W 组合的访问属性如下所示:
页转换
前边我们已经知道,保护模式下线性地址 = 段基地址(32 位) + 偏移量(32 位)
。接下来就是将这个线性地址映射到物理地址。具体过程见最后大图。
虚拟地址到物理地址映射的全过程
虚拟地址到物理地址映射的全过程如下图所示(一图胜万言…):
利用 TLB 加速地址翻译
从上文我们知道,每次 CPU 产生一个虚拟地址,MMU 就需要按二级页表映射将虚拟地址(线性地址)翻译为物理地址。在最糟糕的情况下,需要获取的数据不在高速缓存(如 L1)中,这样的代价是几十到几百个周期。但如果我们将每次地址翻译后的“虚拟地址->物理地址”的映射关系高速缓存(容量是有限的,存在覆盖情况),这样以后需要地址翻译时,可以优先查找已缓存“虚拟地址->物理地址”的映射关系目录,如果刚好已有对应关系,那就不需要二级页表映射,而且如果要取得数据刚好在高速缓存(如 L1),那么整个开销就会下降到 1 个或 2 个周期。
上边提到的高速缓冲称为
TLB (Translation Lookaside Buffer)
,是一个小的、虚拟寻址的缓存,充分利用了局部性
(参考《深入理解计算机系统》第 6.2 节“局部性”)。利用 TLB 加速地址翻译的步骤如下:
- CPU 产生一个虚拟地址(线性地址)。
- MMU 从 TLB 取出相应的“虚拟地址->物理地址”的映射关系项(《深入理解计算机系统》中称为 PTE,Page Table Entry,即页表项。实际 TLB 记录的是“虚拟地址->物理地址”的映射关系)。
- MMU 将这个虚拟地址翻译成物理地址,并且将它发送到高速缓存或主存。
- 高速缓存或主存将所请求的数据返回给 CPU。
当 TLB 不命中时,MMU 需要从高速缓存的页表或按二级页表映射将虚拟地址翻译为物理地址,并将这两者的映射关系存放到 TLB。这可能会覆盖一个已经存在的映射关系。
整个的利用 TLB 加速地址翻译的流程如下图所示:
图片来源
下图表示存储器层次结构(《深入理解计算机系统》第 6.3 节“存储器层次结构”):