MIT6828 学习笔记 008 (lec 4)

MIT6828 学习笔记 008 (lec 4)

RayAlto OP

目标:

  • 地址空间
  • 分页硬件
  • Xv6 虚拟内存代码

虚拟内存概述

问:如果 shell 有个 bug 会往随即的内存地址写数据,内核应该怎么阻止这个操作把自己或者把其他进程搞崩?答:分离每个进程的地址空间。那么如何实现在一块物理内存上分离出多个梅村空间?

Xv6 使用 RISC-V 的分页硬件实现,分页给地址提供了一定等级的间接性:

1
2
CPU ---> MMU ---> RAM
VA PA

MMU: Memory Management Unit (内存管理单元)
VA: Virtual Address (虚拟地址)
PA: Physical Address (物理地址)

  • 软件只能使用虚拟地址
  • 内核告诉 MMU 如何把虚拟地址映射到物理地址
  • MMU 通过分页表把虚拟地址转换为物理地址
  • 每个地址空间都有自己的一个分页表
  • MMU 可以限制用户代码可访问的虚拟地址范围
  • 通过对 MMU 编程,内核实现了虚拟地址到物理地址的映射的完全控制,实现了许多有趣的操作系统特性/技巧

RISC-V 映射 4-KB 分页,想要支持访问分页里 4K 个 byte 的话需要 12 个 bit 的 offset () ,所以分页的虚拟地址只使用顶部 52 个 bit ,而这 52 个 bit 里顶部的 25 个 bit 因为目前 RISC-V 计算机内存大小一般用不到(以后可以扩展)所以也没有使用,所以分页虚拟地址的索引是 27 个 bit

注意虚拟地址的长度与物理地址不一样

问:把分页表设计成 PTE page_table[] 合理吗?答:写全应该是 PTE page_table[2^27] ,大小为,反正就是每个分页表都能浪费很大内存空间

问:访问一个没有 V flag 的分页或写入一个没有 W flag 的分页会导致什么?答: page fault ,会强制转移回内核(在 Xv6 下是 kernel/trap.c ),内核处理错误、终止这个进程;或者新分配一个 PTE 然后继续运行这个进程

问:为啥内核也要用虚拟地址,为啥不直接用物理地址?答:理论可行,实际上标准的内核没有这么做的,原因并不特别令人信服:虚拟内存相关硬件使虚拟内存很难被禁用(如进入系统调用需要禁用虚拟内存);内核自己也能通过虚拟地址得到好处

此页目录
MIT6828 学习笔记 008 (lec 4)