From dadfac6479807ab8d94ae021ba4802df3cf42161 Mon Sep 17 00:00:00 2001 From: shell raining <72488394+shellRaining@users.noreply.github.com> Date: Sun, 14 Aug 2022 12:18:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=202021=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=9A=84=20xv6=20book=EF=BC=8C=E6=B7=BB=E5=8A=A0=E4=BA=86?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tranlate_books/book-riscv-rev1/c3/s1.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tranlate_books/book-riscv-rev1/c3/s1.md b/tranlate_books/book-riscv-rev1/c3/s1.md index d4b3110..0fdcbc4 100644 --- a/tranlate_books/book-riscv-rev1/c3/s1.md +++ b/tranlate_books/book-riscv-rev1/c3/s1.md @@ -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***)中定义。