xv6 lec04 Page tables


4.1 课程内容简介

  • 虚拟内存可以实现进程间的隔离

4.2 地址空间(Address Spaces)

4.3 页表(Page Table)

  • 页表主要是在硬件中通过处理器与内存管理单元(Memory Management Unit)实现,所以,在你们的脑海中,应该有这么一张图:CPU正在执行指令,例如sd $7, (a0)。对于任何一条带有地址的指令,其中的地址应该认为是虚拟内存地址而不是物理地址。
  • 在RISC-V中,页表的地址是存放在SATP寄存器中,SATP中存的是物理地址
  • MMU会去内存中读取page table,然后完成翻译
  • 物理内存是56bit是因为主板上只有56根线
  • MMU如果索引结果为空,那么就是page fault了?

4.4 页表缓存(Translation Lookaside Buffer)

  • TLB中保存的是虚拟地址到物理地址的映射缓存
  • TLB会在切换页表的时候清空,清空快表的指令是sfence
  • page table是由硬件实现的,所以在xv6中,page table的查找发生在硬件中,MMU是硬件的一部分而不是OS的一部分。但是在XV6中有个叫walk的函数模拟了MMU的功能
  • 每一个CPU核中,都有一个MMU与TLB,对于cache的地址索引会根据其是由物理地址还是虚拟地址索引,来决定其索引是MMU前后

4.5 Kernel Page Table

  • kernel stack被映射了两次?在kernel data处也映射了kernel page,在PHYSTOP之上也映射了kernel stack,也就说高处的虚拟地址的kernel stack因为存在guard page,好处理错误,所以kernel stack的虚拟地址都用的是PHYSTOP之上的。但是在scheduler中涉及到了kernel stack的直接映射的获取,那么scheduler究竟到底什么时候被设置的?
  • 在free memory对应的物理地址中存放用户进程的text,data,page table

4.6 kvminit 函数

  • 这里指的128是这个

4.7 kvminithart 函数

  • kvminit函数设置了SATP函数
  • 在这条指令之前,使用的内存地址都是真实的物理地址

4.8 walk 函数

  • 为什么3级page table会比大的page table更好呢?