RISC-V 虚拟内存机制随笔
相关知识
虚拟内存
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
通过内存地址虚拟化,可以使得软件在没有访问某虚拟内存地址时不分配具体的物理内存,而只有在实际访问某虚拟内存地址时,操作系统再动态地分配物理内存,建立虚拟内存到物理内存的页映射关系,这种技术称为按需分页(demand paging)。把不经常访问的数据所占的内存空间临时写到硬盘上,这样可以腾出更多的空闲内存空间给经常访问的数据;当CPU访问到不经常访问的数据时,再把这些数据从硬盘读入到内存中,这种技术称为页换入换出(page swap in/out)。这种内存管理技术给了程序员更大的内存“空间”,从而可以让更多的程序在内存中并发运行。
内存管理单元MMU
MMU(Memory Management Unit)是一种负责处理中央处理器(CPU)的内存访问请求的计算机硬件。它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制。
MMU位于处理器内核和连接高速缓存以及物理存储器的总线之间。如果处理器没有MMU,CPU内部执行单元产生的内存地址信号将直接通过地址总线发送到芯片引脚,被内存芯片接收,这就是物理地址。
如果MMU存在且启用,CPU执行单元产生的地址信号在发送到内存芯片之前将被MMU截获,这个地址信号称为虚拟地址,MMU会负责把虚拟地址翻译成相应的物理地址,然后发到内存芯片地址引脚上。简而言之,当处理器内核取指令或者存取数据的时候,会提供一个虚拟地址,这个地址是可执行代码在编译的时候由链接器生成的。MMU负责将虚拟地址转换为物理地址,以在物理存储器中访问相应的内容。
分页机制
分页机制的基本思想是将程序的虚拟地址空间划分为连续的,等长的虚拟页。虚拟页和物理页的页长固定且相等(一般情况下为4KB),从而操作系统可以方便的为每个程序构造页表,即虚拟页到物理页的映射关系。逻辑上,该机制下的虚拟地址有两个部分组成:1.虚拟页号;2.页内偏移。在具体的翻译过程中,MMU首先解析得到虚拟地址中的虚拟页号,并通过虚拟页号查找到对应的物理页,用该物理页的起始地址加上页内偏移得到最终的物理地址。
操作系统的实际转换流程
当程序(操作系统)在M特权级初始化完成后,CPU将跳转到内核入口点并在S特权级上执行,此时还并没有开启分页模式,内核的每次访存是直接的物理内存访问。
而在开启分页模式之后,内核代码在访存时只能看到内核地址空间,此时每次访存需要通过 MMU 的地址转换。这两种模式之间的过渡在内核初始化期间完成。
按照 satp CSR 格式要求 构造一个无符号 64 位无符号整数,使得其分页模式为 SV39 ,且将当前多级页表的根节点所在的物理页号填充进去。在 activate 中,我们将这个值写入当前 CPU 的 satp CSR ,从这一刻开始 SV39 分页模式就被启用了,而且 MMU 会使用内核地址空间的多级页表进行地址转换。
摘自Rcore实验指导:我们必须注意切换 satp CSR 是否是一个 平滑 的过渡:其含义是指,切换 satp 的指令及其下一条指令这两条相邻的指令的虚拟地址是相邻的(由于切换 satp 的指令并不是一条跳转指令, pc 只是简单的自增当前指令的字长),而它们所在的物理地址一般情况下也是相邻的,但是它们所经过的地址转换流程却是不同的——切换 satp 导致 MMU 查的多级页表是不同的。这就要求前后两个地址空间在切换 satp 的指令 附近 的映射满足某种意义上的连续性。
地址转换
Sv39的转换即为下图:
注:可深入阅读Rare[3]中的相关过程,会有更深的理解。
详见The RISC-V Instruction Set Manual, Volume II: Privileged Architecture
4.3 4.4 节
相关资料来自:
- [1] Rcore实验指导书 http://wyfcyx.gitee.io/rcore-tutorial-book-v3/chapter4/6multitasking-based-on-as.html
- [2] 知乎作者 水dong方块 https://www.zhihu.com/question/25628124/answer/2308945192
- [3] Rare: Rust A Riscv Emulator https://siriusdemon.github.io/Rare/v10-Page-Table.html
- [4] The RISC-V Instruction Set Manual, Volume II: Privileged Architecture http://www.five-embeddev.com/riscv-isa-manual/latest/supervisor.html#sv32algorithm