内存控制单元(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 分段过程
- 根据段选择符的 TI 字段,决定从 GDT(gdtr 寄存器) 还是 LDT(ldtr 寄存器) 中取段描述符,获得一个4字节表头地址。
- 将段选择符的 index 字段(13位,表示第index个)乘以 8(段描述符大小)获得相对地址,再与 gdtr 或 ldtr 寄存器中的内容相加,得到段描述符地址。
- 逻辑地址的偏移量与段描述符的 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。