根据 2021 版本的 xv6 book,添加了新的内容

This commit is contained in:
shell raining
2022-08-14 12:18:32 +08:00
committed by GitHub
parent babe5774eb
commit dadfac6479

View File

@@ -14,7 +14,11 @@ XV6基于Sv39 RISC-V运行这意味着它只使用64位虚拟地址的低39
![img](../images/c3/p2.png)
如果转换地址所需的三个PTE中的任何一个不存在页式硬件就会引发页面故障异常page-fault exception并让内核来处理该异常参见第4章这种三级结构允许页表在大范围虚拟地址没有映射的情况下忽略整个页表页面。
如果转换地址所需的三个PTE中的任何一个不存在页式硬件就会引发页面故障异常page-fault exception并让内核来处理该异常参见第4章
与图 3.1 的单级设计相比,图 3.2 的三级结构使用了一种更节省内存的方式来记录 PTE。在大范围的虚拟地址没有被映射的常见情况下三级结构可以忽略整个页面目录。举个例子如果一个应用程序只使用了一个页面那么顶级页面目录将只使用条目0条目 1 到 511 都将被忽略因此内核不必为这511个条目所对应的中间页面目录分配页面也就更不必为这 511 个中间页目录分配底层页目录的页。 所以,在这个例子中,三级设计仅使用了三个页面,共占用 $3\times4096$个字节。
因为 CPU 在执行转换时会在硬件中遍历三级结构,所以缺点是 CPU 必须从内存中加载三个 PTE 以将虚拟地址转换为物理地址。为了避免从物理内存加载 PTE 的开销RISC-V CPU 将页表条目缓存在 Translation Look-aside Buffer (TLB) 中。
每个PTE包含标志位这些标志位告诉分页硬件允许如何使用关联的虚拟地址。`PTE_V`指示PTE是否存在如果它没有被设置对页面的引用会导致异常即不允许`PTE_R`控制是否允许指令读取到页面。`PTE_W`控制是否允许指令写入到页面。`PTE_X`控制CPU是否可以将页面内容解释为指令并执行它们。`PTE_U`控制用户模式下的指令是否被允许访问页面;如果没有设置`PTE_U`PTE只能在管理模式下使用。图3.2显示了它是如何工作的。标志和所有其他与页面硬件相关的结构在(***kernel/riscv.h***)中定义。