内存控制单元(MMU)由分段单元分页单元组成。

  • 分段单元:将逻辑地址转换成一个线性(虚拟)地址,给一个进程分配不同的线性地址空间。
  • 分页单元:将线性(虚拟)地址转化成一个物理地址,把同一线性地址空间映射到不同的物理空间。

其中,逻辑地址由一个段和偏移量组成;线性地址是一个uint32_t,可以表达4G的地址;物理地址用于内存寻址。

1分段单元:逻辑地址—>线性地址

给一个进程分配不同的线性地址空间。

1.1 段选择符


段选择符中的字段:

  • index,GDT或LDT的段描述符的入口,即其在GDT或LDT中的相对地址
  • TI,Table Indicator,TI = 0,GDT 中;TI = 1,LDT 中。
  • RPL,请求者特权级。

1.2 段描述符

段描述符大小为8字节,存于GDT或LDT,描述了一个段的特征,其Base字段可以得到对应段的首地址的线性地址

4 个主要的 Linux 段的段描述符:用户代码段、用户数据段、内核代码段、内核数据段

1.3 分段过程

  1. 根据段选择符的 TI 字段,决定从 GDT(gdtr 寄存器) 还是 LDT(ldtr 寄存器) 中取段描述符,获得一个4字节表头地址。
  2. 将段选择符的 index 字段(13位,表示第index个)乘以 8(段描述符大小)获得相对地址,再与 gdtr 或 ldtr 寄存器中的内容相加,得到段描述符地址
  3. 逻辑地址的偏移量与段描述符的 Base 字段值相加,获得对应线性地址,即虚拟地址。

2 分页:线性地址—>物理地址

2.1 基本概念

  • :线性地址被分成以固定长度为单位的组 一般为4kB。
  • 页框:分页单元把 RAM 分成固定长度的页框,与页的长度一致。页可以存放在任何页框中。(物理页)
  • 页表:把线性地址映射到物理地址的数据结构,存放在主存中,在启用分页单元前由内核对页表初始化。

2.2 32位机下的(常规分页)二级页表

32 位线性地址被分成 3 个域:

  • Directory,目录,高 10 位。 用于选择页目录中的目录项,指向适当的页表
  • Table,页表,中间 10 位。 选择页表中的表项,含有页所在页框的地址
  • Offset,偏移量,最低 12 位。决定页框中的相对位置,读指定偏移量的地址中的内容,最大为页大小(4096kB)

活动进程都有一个页目录。正在使用的页目录的物理地址存放在控制寄存器 cr3 中
把同一线性地址空间映射到不同的物理空间,分为两步:基于页目录表(page directory)和基于页表(page table)。

使用这种二级页表模式可减少每个进程页表所需 RAM 的数量
一级页表模式若使用4GB线性地址空间,需要220个表项(4GB/4KB),每项4字节的话也需要4MB的RAM空间。

而二级页表模式通过进程实际需要一个页表时才给该页表分配RAM来减少内存使用量。

2.3 64位机的情况

64位机并不适合使用二级分页:
假设每页4KB = 212byte,则若保证offset可以表达页的任何一个地址,需要12位。假设我们仅仅使用64位中的48位来寻址,则Directory和Table需要占36位,我们各分配18位,那么每个进程的每个页目录和页表都会有218个小项。过多的项同时占据RAM会导致占用空间过大
因此64位机下使用3/4级页表设计。

2.4 硬件高速缓存(SRAM,已获得物理地址时使用)


硬件高速缓存基于局部性原理(常用的地址在最近的将来被用到的可能性较大),目的是缩小CPU与RAM之间的速度不匹配,由高速缓存内存高速缓存控制器组成。
硬件上使用了速度较快的SRAM,减少了从速度较慢的DRAM读写的时间。
引入“行”单位:高速缓存被细分为行的子集。大多数高速缓存是 N-路组关联的,主存中的任意一个行可以存放在高速缓存 N 行中的任意一行。
真正的行存于SRAM、存储行地址的表项的数组存于高速缓存控制器。
每个表项有一个标签(tag),用于辨别行所映射的内存单元
内存物理地址通常分 3 组,高几位对应标签,中间几位对应高速缓存控制器的子集索引,最低几位对应行内的偏移量
当我们用一个物理地址 访问一个 RAM 存储单元时,CPU 取出物理地址中的子集索引号,并把子集中所有行的标签与物理地址高几位比较,如果某行的标签与物理地址的高几位相同,则 CPU 命中一个高速缓存。
在若没有命中,高速缓存行被写回内存中,如果有必要则取出放到告诉缓存表项中。

对于读操作,控制器从告诉缓存行中选择数据并送回寄存器,不需要访问RAM,节省了时间。
对于写操作,又分为通写write-through和回写write-back

高速缓存侦听:只要一个 CPU 修改了它的硬件高速缓存,它就必须检查其他硬件高速缓存是否包含相同的数据;如果是,通知其他 CPU 进行更新。由硬件处理,内核无需关心。

2.5 快表、转换后援缓冲器(TLB)【不太懂???】

了硬件高速缓存,TLB 也可以加速线性地址向物理地址转换。

一个线性地址被第一次使用时,需通过慢速访问 RAM 中的页表计算出物理地址。同时,物理地址被存放在一个 TLB 表项中,下次使用同一线性地址时就可以直接从 TLB 中取。

2.6 Linux中的分页

Linux采用兼容32/64位机 4 级分页模型:

  • 页全局目录(Page Global Directory)
  • 页上级目录(Page Upper Directory)
  • 页中间目录(Page Middle Directory)
  • 页表(Page Table)

内核为页上级目录和页中间目录保留了位置。每个进程有自己的页全局目录和页表集。
对于 32 位系统,如果没有启用物理地址扩展,2 级页表即可,页上级目录和页中间目录全为 0。