MIT6828 学习笔记 008 (lec 4)
目标:
- 地址空间
- 分页硬件
- Xv6 虚拟内存代码
虚拟内存概述
问:如果 shell 有个 bug 会往随即的内存地址写数据,内核应该怎么阻止这个操作把自己或者把其他进程搞崩?答:分离每个进程的地址空间。那么如何实现在一块物理内存上分离出多个梅村空间?
Xv6 使用 RISC-V 的分页硬件实现,分页给地址提供了一定等级的间接性:
1 | CPU ---> MMU ---> RAM |
MMU: Memory Management Unit (内存管理单元)
VA: Virtual Address (虚拟地址)
PA: Physical Address (物理地址)
- 软件只能使用虚拟地址
- 内核告诉 MMU 如何把虚拟地址映射到物理地址
- MMU 通过分页表把虚拟地址转换为物理地址
- 每个地址空间都有自己的一个分页表
- MMU 可以限制用户代码可访问的虚拟地址范围
- 通过对 MMU 编程,内核实现了虚拟地址到物理地址的映射的完全控制,实现了许多有趣的操作系统特性/技巧
RISC-V 映射 4-KB 分页,想要支持访问分页里 4K 个 byte 的话需要 12 个 bit 的 offset (
注意虚拟地址的长度与物理地址不一样
问:把分页表设计成 PTE page_table[] 合理吗?答:写全应该是 PTE page_table[2^27] ,大小为
问:访问一个没有 V flag 的分页或写入一个没有 W flag 的分页会导致什么?答: page fault ,会强制转移回内核(在 Xv6 下是 kernel/trap.c ),内核处理错误、终止这个进程;或者新分配一个 PTE 然后继续运行这个进程
问:为啥内核也要用虚拟地址,为啥不直接用物理地址?答:理论可行,实际上标准的内核没有这么做的,原因并不特别令人信服:虚拟内存相关硬件使虚拟内存很难被禁用(如进入系统调用需要禁用虚拟内存);内核自己也能通过虚拟地址得到好处