Mas0n
to be reverse engineer🐧
翻车鱼

Operation system Learning Note: Page Tables

Operation system Learning Note: Page Tables

Based on XV6 RISC-V Sv39

RISC-V指令使用的是虚拟地址,而在真实硬件中对应的RAM或物理内存是由物理地址索引的,这意味着其中必然存在一个将physical address转换为virtual address的过程,即页表。

页表将虚拟地址映射到物理地址上为两者建立关系。

在探究页表结构之前,需要知道XV6是基于Sv39 RISC-V运行的,这意味着xv6只能使用64位虚拟地址中的低39位:其中前27位用于索引页表,因此RISC-V逻辑上拥有\(2^{27}\)个页表条目page table entires(PTEs)。

每个PTEs包含44位的物理页码physical page number(PPN)和一些标志位。分页硬件将39位虚拟地址的前27位作为索引,用于寻找PTE。而后生成一个56位的物理地址,其中44位来自于PTE中的PPN,余下的12位来自于虚拟地址。

下图展示了上述过程,页表的逻辑视图是一个简单的PTE数组(下文将进一步解释)。

https://cdn.shi1011.cn/2022/07/81991752486eb081570528ca2a312b23.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

页表通过虚拟-物理地址的转换为操作系统提供了控制权,其中的粒度为4096(\(2^{12}\))字节对齐的区块,这样的区块被称作页。

在Sv39 RISC-V中,虚拟地址的前25位不被使用。物理地址也有其增长的空间:在PTE格式中,PPN能够利用剩下的10位空间继续增长。

\(2^{39}\ Bytes = 512\ GB\) ,这样的空间在RISC-V计算机中足以运行大多数程序。

而\(2^{56} \ bytes\)足以容纳未来可能出现的I/O设备和DRAM芯片,当然如果需要更多的空间,RISC-V的设计者制定了Sv48,即使用48位虚拟地址。

下图是RISC-V地址转换具体细节

https://cdn.shi1011.cn/2022/07/53a8648bd268ca0b0157340fe8c937a8.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

RISC-V CPU将虚拟地址转换为物理地址的过程分为三个步骤。

页表以三级结构存储在物理内存中。根节点是一个大小为4096字节的页表页,包含512个PTE,以及该节点下一级页表页的物理地址。同样的,二级页表页包含末级页表页的物理地址。

分页硬件使用27位中的前9位索引根节点,中间9位索引二级节点,最后9位索引末级节点,即最终指向一个PTE。(当然,在Sv48中,其拥有四级结构)

如果转换地址所需的三个PTE中的任何一个不存在,分页硬件就会引发页面错误异常,让内核来处理该异常。相比于上文所述的单级结构,这种三级结构允许内存以高效的方式存储PTEs:允许页表在大范围虚拟地址没有映射的情况下忽略整个页表页面。

尽管作为执行加载或存储指令的一部分,CPU在硬件中遍历三级结构,但三级结构的潜在缺点是CPU必须从存储器加载三个PTE,以执行加载/存储指令中的虚拟地址到物理地址的转换。 为了避免从物理内存加载PTE的成本,RISC-V CPU在转换后备缓冲器Translation Look-aside Buffer(TLB)中缓存PTEs。

每一个PTE包含标志位,告诉分页硬件如何允许使用关联的虚拟地址。PTE_V标识PTE是否存在,如果它没有被设置,当引用该PTE时,将引发异常(即不允许)。PTE_R控制是否允许指令读取到PTE。PTE_W控制是否允许指令写入到PTE。PTE_X控制CPU是否可以将PTE的内容解释为指令并执行它们。PTE_U控制用户模式下的指令是否被允许访问PTE;如果没有设置PTE_U,PTE只能在管理模式下使用。

为了告诉硬件使用页表,内核必须将根页表页的物理地址写入satp寄存器中。每个CPU都有自己的satp。一个CPU将使用自己的satp指向的页表翻译后续指令产生的所有地址。每个CPU都有自己的satp,这样不同的CPU就可以运行不同的进程,每个进程都有自己的页表描述的私有地址空间。

通常,内核将所有物理内存映射到它的页表中,这样它就可以使用加载/存储指令读写物理内存中的任何位置。由于页目录在物理内存中,内核可以通过使用标准存储指令写入PTE的虚拟地址来编写页目录中PTE的内容。

Reference

https://pdos.csail.mit.edu/6.828/2021/xv6/book-riscv-rev2.pdf

本文链接:https://blog.shi1011.cn/learn/2307
本文采用 CC BY-NC-SA 4.0 Unported 协议进行许可

Mas0n

文章作者

发表回复

textsms
account_circle
email

翻车鱼

Operation system Learning Note: Page Tables
Based on XV6 RISC-V Sv39 RISC-V指令使用的是虚拟地址,而在真实硬件中对应的RAM或物理内存是由物理地址索引的,这意味着其中必然存在一个将physical address转换为virtual addre…
扫描二维码继续阅读
2022-07-10