第九章的内容为p595~p649, 分2部分, p596~p618, p618~p649. 本文为第1部分.
摘要
本章主要写虚拟内存的原理. 与我之前理解的虚拟内存有很大不同, 之前"以为"的虚拟内存是由于内存容量不够, 临时将内存暂时用不到的部分存到磁盘上.
应用程序直接与内存交互, 磁盘只是一个备用的存储.
实际上读了本章发现, 应用程序直接对应虚拟内存, 虚拟内存对应磁盘, 而物理内存是磁盘的缓存. 应用程序需要读取某块虚拟内存的内容时, 先查表看是否物理内存命中, 命中了则从物理内存中读取, 否则触发缺页中断, 从磁盘上将内容复制到物理内存中后, 再继续读取. 而物理内存满后, 则会淘汰物理内存页, 将淘汰的物理内存页写回磁盘.
这里有一些细节省略了, CPU拿到的是虚拟地址, 需要MMU单元对虚拟地址进行翻译, 翻译为物理地址并取到数据, 在翻译的过程中, 会做很多事情.
- 首先地址是分了页的, 一般4K为一页, 先取到虚拟页号
- 虚拟页号, 划分为TLBI和TLBT, 根据这2个值去TLB(虚拟页号与物理页号对应关系缓存)中取物理页号
- 如果TLB缓存命中, 则执行下一步, 否则要去内存中取虚拟页号与物理页号对应关系
- 根据物理页号与虚拟偏移量, 拼出物理地址, 划分为CO, CI, CT. 根据这3个值去L1高速缓存查找数据
- 如果L1高速缓存命中, 则返回数据; 否则去内存中查找数据.
- 如果内存命中, 则将数据复制到L1高速缓存, 通过高速缓存进行返回; 否则触发缺页中断, 等待磁盘写入内存(DMA)
上面讲的是读数据的情况, 写数据有两种模式, 直写(write through)与回写(write back). 直写是指写入数据时, 不光要将数据写入L1高速缓存, 同时也要写入内存, 保证数据的强一致性. 回写是指先写入L1高速缓存, 等总线不繁忙时, 再写入内存. 现在采用的是回写方式.
上面的过程还省略了, 翻译时的权限判断, 多级页表等内容.
缩写
本章缩写很多, 先记录一下.
-
PA: Physical Address, 物理地址. M=2^m.
-
VA: Virtual Address, 虚拟地址. N=2^n
-
MMU; Memory Management Unit, 内存管理单元
-
VP: Virtual Page, 虚拟页. P=2^p, 虚拟页大小, 如4K.
-
PP: Physical Page, 物理页, 也被称为page frame
-
PTE: Page Table Entry, 页表条目
-
VPO: 虚拟页面偏移量(字节)
-
VPN: 虚拟页号
-
TLBI: TLB索引
-
TLBT: TLB标记
-
PPO: 物理页面偏移量(字节)
-
PPN: 物理页号
-
CO: 缓冲块内的字节偏移量
-
Cl: 高速缓存索引
-
CT: 高速缓存标记
-
PTBR: Page Table Base Register, 页表基址寄存器
-
TLB: Translation Lookaside Buffer, 翻译后背缓冲器