MIPS虚拟地址和物理地址映射关系图
做存储器地址转换的原因
- 隐藏和保护,因为软件只能看到虚拟地址,看不到真实的物理地址。运行在用户特权级的程序,最终被映射到的地址位于kuseg的范围内
- 给程序分配连续的存储空间。因为连续的地址空间可以使得程度具有更快的运行速度,虽然在物理地址中映射的空间不一定是连续的,但是在虚拟地址中是连续的地址空间。
- 扩大地址范围。有些CPU不能直接访问他们物理存储器的全部范围,如果想访问更大的范围,需要使用MMU
- 使存储器映射适应你的程序。在一个大的操作系统里,有可能运行者一个程度的多个拷贝,此时使用同样的程度地址要容易得多。
- 按需调页。操作系统只有在真正用到这块内存资源时才会分配。
- 重定位。MMU允许程序在物理内存的任意地址上运行
TLB/MMU的硬件及其作用
TLB可以将虚拟地址转换为物理地址,实质上是一块cache,因为cache面积较大,较为昂贵,所以不能支持太多的表项。在TLB的转换过程中每一个表项通常对应于一个4KB大小的页。这就使TLB可以用有限的表项映射更大范围的物理地址。
每一个表项中含有一个虚拟地址(VPN)以及物理地址(PFN),当程度给出一个虚拟地址后,将会在TLB表项中寻找VPN与其对应,如果对应则给出PFN,如果没有找到对应的VPN则会引起TLB重填异常。
上文说在TLB的转换过程中每一个表项通常对应于一个4KB大小的页,这就使得低12位的地址不参与查找,同时在MIPS CPU中采用的是一个TLB表项对应两个相邻的虚拟页面,这使得倒数第13位也不参与查找,也就是低13位不参与查找过程。
如上图所示,显示的是一个TLB表项所需的所有寄存器部分
- EntryHi寄存器存有VPN2以及ASID
- PageMask可以创建映射大于4KB大小的页(与EntryHi一起构成了输入域)
- EntryLo0-1存有PFN以及四个标志位G,V,D,C(TLB的输出域)
其中VPN2指的就是虚拟地址,0-13位不参与查找,对于超过CPU使用的高位区域要全部置0或1,在64位的MIPS中,因为有R值的存在,要和R值匹配。仅使用32位指令集时,因为符号位扩展的,这些情况不必考虑。在低于VPN2的位有部分0区域的存在,此部分用于小范围的页地址的扩展,把部分位转换为需查找虚拟地址范围,比如页大小为1KB,需向下延伸两位。
ASID指的是地址空间标识符,如果使用的多个地址空间,操作系统将会维护此区域。如果输出域的G位被置1,则意味着屏蔽了ASID,表示在全局查找。ASID是一个8位的域,允许同时映射256个不同的地址空间,如果用光了可以挑选一个扔出TLB的进程。
PageMask寄存器允许你通过设置TLB域来映射更大的页,通常为4KB-16MB之间,并且每次以4倍递增
如上图所示为EntryLo0-1的寄存器域结构
PFN即物理地址,和VPN相对应,图中所示32位MIPS中可支持2的38次方的字节地址范围(26+12)
C寄存器域指的是此地址是否选择高速缓存的工作方式(嵌入式)
D位指的是写允许为,1表示允许写入
V位指的是该如果该位为0,则表示对与该项匹配的地址的任何使用都将导致异常
G位指的是是否屏蔽ASID的值,如果置1则表示将全局搜索,忽略ASID的匹配
Index寄存器用于选择TLB的表项
Random用于实现随机替换策略
Wired寄存器,在TLB从0开始向上,凡是索引值小雨下限值的表项不受随机替换的影响,Wired允许你指定这个下限值,可将这些槽用于永久转换地址项
Context寄存器能够帮助32位虚拟地址空间的TLB重填过程
TLB/MMU控制指令
tlbr 在索引处读出TLB表项
tlbwi 在索引处写入TLB表项
tlbwr 重填过程中采用此命令写入新的TLB表项
tlbp 寻找匹配的TLB表项,并将该项的索引保存到index寄存器
页表和重填机制
TLB未命中时,采用异常处理代码如下