虚拟地址到物理地址的转换
虚拟地址是操作系统为了保证程序运行的隔离性,给每个进程分配的完整空间,这个空间分内核空间与用户空间。这个虚拟地址还有一个作用就是用于寻址,因为虚拟地址是一个抽象的概念,不同的进程虚拟空间分布是类似的,但是同一个虚拟地址可能对应完全不一样的物理地址。
虚拟地址可以被分为多段:全局页目录项、上层页表项、中间页表项、页表项
这四个部分对应了多级页表每一级的内容,但是要注意,页表里面用于寻找下一级页表的地址是物理地址,而不是虚拟地址,虚拟地址只用于索引。可能听起来有点抽象,接下来举个具体例子。
全局页目录项、上层页表项、中间页表项、页表项
虚拟地址: 0x123456789 (随便写的,32位只有八位用不到三级页表)
假如1代表全局页目录项、234代表上层页表项、567代表中间页表项、8代表最终页表项,注意:这里都是虚拟地址
接下来进行一个查表的过程:
全局页目录项会在一个控制寄存器放着,所以可以直接在里面找表,查 1 对应的下一级页表物理地址的起始地址,假设为 A
接下来去A物理地址对应的上层页表项,在里面找虚拟地址为234对应的下一级页表物理地址的起始地址,假设为B
接下来去B物理地址对应的中间页表项,查 567 对应的下一级页表物理地址的起始地址,假设为C
接下来到了最后的页表项C的物理地址,在里面查 789 索引对应的物理地址,就是最终要找的物理页号的物理地址,假设为 D
D就是要找的物理页号,然后加上offset ,也就是 D+offset 就组合得到了最终的物理地址,完成了寻址。
回顾整个寻址过程,不同页表之间的虚拟地址没有关系,本级的虚拟地址是用来在这一级物理地址对应的页表里面作为索引的,这个索引指向了下一级页表的物理地址。
所以虽然虚拟地址是这样拼接的,但是最终的物理地址只有最后一级的页表项里面存放的物理页号的物理地址才是要找的,中间页表里面的物理地址都存放的是这虚拟地址与下一级页表的物理地址。
RISC-V和X86区别
RISC-V的根目录页表主要放在SATP寄存器,X86放在CR3寄存器,这里用于查第一级页表虚拟地址索引的下一级页表物理地址。