一、RISC-V 64 架构提供的 SV39 分页硬件机制
在 64 位架构上虚拟地址长度确实应该和位宽一致为 64 位,但是在启用 SV39 分页模式下,只有低 39 位是真正有意义的。SV39 分页模式规定 64 位虚拟地址的 这 25 位必须和第 38 位相同,否则 MMU 会直接认定它是一个不合法的虚拟地址。通过这个检查之后 MMU 再取出低 39 位尝试将其转化为一个 56 位的物理地址。
也就是说,所有 个虚拟地址中,只有最低的 (当第 38 位为 0 时)以及最高的 (当第 38 位为 1 时)是可能通过 MMU 检查的。当我们写软件代码的时候,一个地址的位宽毋庸置疑就是 64 位,我们要清楚可用的只有最高和最低这两部分,尽管它们已经巨大的超乎想象了;而本节中我们专注于介绍 MMU 的机制,强调 MMU 看到的真正用来地址转换的虚拟地址只有 39 位。
stap控制寄存器
上图是 RISC-V 64 架构下 satp 的字段分布,含义如下:
MODE控制 CPU 使用哪种页表实现;ASID表示地址空间标识符,这里还没有涉及到进程的概念,我们不需要管这个地方;PPN存的是根页表所在的物理页号。这样,给定一个虚拟页号,CPU 就可以从三级页表的根页表开始一步步的将其映射到一个物理页号。
当 MODE 设置为 0 的时候,代表所有访存都被视为物理地址;而设置为 8 的时候,SV39 分页机制被启用,所有 S/U 特权级的访存被视为一个 39 位的虚拟地址,它们需要先经过 MMU 的地址转换流程,如果顺利的话,则会变成一个 56 位的物理地址来访问物理内存;否则则会触发异常,这体现了分页机制的内存保护能力。
页表项pte结构
二、内核启动动态内存分配功能(即内核堆内存区域)
使用第三方库buddy_system_allocator 实现的内存分配器,内存区域由静态变量数组提前静态划定(3MB,存在在.bss段),此时还未开启分页机制,使用的是物理地址。开启分页机制后,由于内核使用的直接映射(虚拟地址 = 物理地址),故内存地址任有效。
三、物理页帧管理器 (管理空闲物理内存)
空闲物理内存范围: 内核结束位置(.ekernel编译器符号) --- 硬件最大物理内存 页帧编为物理页号进行管理
四、地址空间
1、内核地址空间
39位地址,地址空间最大512GB,其中低256GB地址空间布局如下: (直接映射)
高256GB地址空间如下:(间接映射)
2、应用地址空间
跳板机制的实现 (本章核心难点)
由于此设计方案,应用地址空间 和 内核地址空间 相互独立,故需要设计跳板页,来实现系统调用(地址空间切换,避免切换前后逻辑地址不连续而无法执行)。 本章核心 内核地址空间布局如下图: