SV39 多级页表的硬件机制主要包括以下方面:
- 页表结构与地址划分1:
- 页表层级:SV39 采用三级页表结构。将 39 位的虚拟地址划分为多个部分,用于在不同层级的页表中进行索引。其中,虚拟页号共 27 位,第 26 - 18 位为一级页索引(vpn0),第 17 - 9 位为二级页索引(vpn1),第 8 - 0 位为三级页索引(vpn2)。每个页表都使用 9 位索引,这样每个页表有 个页表项。
- 页表项大小与页表尺寸:每个页表项为 64 位(8 字节),所以每个页表的大小为 (因为每页的起始位置按 4KB 对齐),刚好可以被放到一个物理页框中。
- 物理地址空间:物理地址通常具有更高的位数,比如 56 位,以便能够访问更大的内存范围,但在 SV39 机制下,主要关注与虚拟地址转换相关的部分物理地址信息。
- 寄存器的作用:
- SATP 寄存器:SATP(Supervisor Address Translation and Protection)寄存器是控制地址转换的关键寄存器。其结构中的 “mode” 字段用于控制 CPU 使用的页表模式,当 mode 设置为 8(b1000)时,分页机制被开启且选用 SV39 分页机制;“asid”(Address Space Identifier)目前暂不涉及进程概念可暂不关注;“ppn” 字段存放的是根页表所在的物理页号,CPU 以此为基础开始地址转换2。
- 地址转换过程1:
- 一级页表查找:首先,根据 SATP 寄存器中记录的根页表的物理页号,CPU 将虚拟地址中的一级页索引(vpn0)作为偏移,在一级页表的物理页中查找对应的页表项。该页表项中包含了二级页表的物理页号信息。
- 二级页表查找:接着,使用虚拟地址中的二级页索引(vpn1)作为偏移,在二级页表的物理页中找到对应的页表项,该页表项中包含了三级页表的物理页号信息。
- 三级页表查找:然后,把虚拟地址中的三级页索引(vpn2)作为偏移,在三级页表的物理页中找到最终的页表项,这个页表项中包含了要访问的虚拟地址对应的物理页号以及相关的标志位(如访问权限、是否有效等)。
- 物理地址生成:最后,将得到的物理页号左移 12 位(因为每页大小为 4KB,偏移量占 12 位),再加上虚拟地址中的偏移量(offset)部分,就得到了虚拟地址对应的物理地址,CPU 便可以通过该物理地址访问实际的物理内存。
- 页表项的标志位:
- 有效位(V 位):页表项中的有效位用于表示该页表项是否合法。只有当 V 位为 1 时,页表项才是有效的,CPU 才能根据该页表项进行地址转换;若 V 位为 0,则表示该页表项对应的虚拟地址范围是无效的,此时如果 CPU 访问该虚拟地址,会引发地址转换异常。
- 访问权限位(R/W/X、U 位等):R/W/X 位分别控制索引到这个页表项的对应虚拟页面是否允许读、写、取指操作;U 位控制索引到这个页表项的对应虚拟页面是否在 CPU 处于用户特权级(U 特权级)的情况下被允许访问。A 位(accessed)记录自从该位被清零之后,页表项的对应虚拟页面是否被访问过;D 位(dirty)则记录自从该位被清零之后,页表项的对应虚拟页面是否被修改过。这些标志位对于内存的访问控制和管理非常重要。
- 物理页帧的管理:
- 物理页帧的分配:物理内存被划分为多个物理页帧,当需要建立新的页表或者存储应用程序的数据时,系统需要分配物理页帧。例如,在创建页表的过程中,如果某个级别的页表不存在,系统会申请一个物理页框,并在其中创建相应的页表。
- 物理页帧的回收:当应用程序结束或出现错误时,系统需要回收该应用程序所占用的物理页帧,以便重新分配给其他应用程序或页表使用。这涉及到对物理页帧的跟踪和管理,确保内存的有效利用和资源的正确释放。