响应Page fault需要的信息
- 出错的虚拟地址,或者是触发page fault的源。当出现page fault的时候,XV6内核会打印出错的虚拟地址,并且这个地址会被保存在STVAL寄存器中。
- 出错的原因。存储在SCAUSE寄存器中,在RISC-V的文档关于SCAUSE寄存器的介绍中,有多个与page fault相关的原因。比如,13表示是因为load引起的page fault;15表示是因为store引起的page fault;12表示是因为指令执行引起的page fault。
- 我们或许想要知道的第三个信息是触发page fault的指令的地址。从上节课可以知道,作为trap处理代码的一部分,这个地址存放在
SEPC
(Supervisor Exception Program Counter)寄存器中,并同时会保存在trapframe->epc
内存分配策略
按需填零
Copy On Write Fork
Demand Paging
分页
- 对于exec,我们为text和data分配好地址段,但是相应的PTE并不对应任何物理内存page(将valid bit位设置为0)
- 应用程序是从地址0开始运行。text区域从地址0开始向上增长。位于地址0的指令是会触发第一个page fault的指令
需要在某个地方记录了这些page对应的程序文件,在page fault handler中从程序文件中读取page数据,加载到内存中;将内存page映射到page table;最后再重新执行指令
换页
内存已经耗尽而此时又出现了page fault,需要从文件系统拷贝中拷贝一些内容到内存中
- 结合PTE中的Dirty bit和Access bit等实现LRU算法来找到适合换出的页
- 刚刚空闲出来的page,分配给刚刚的page fault handler,再重新执行指令
Memory Mapped Files
核心思想是,将完整或者部分文件加载到内存中,这样就可以通过内存地址相关的load或者store指令来操纵文件。
现代操作系统都是以lazy的方式实现。你不会立即将文件内容拷贝到内存中,而是先记录一下这个PTE属于这个文件描述符。相应的信息通常在VMA(Virtual Memory Area)结构体中保存。例如对于这里的文件f,在VMA中会记录文件描述符,偏移量等等,这些信息用来表示对应的内存虚拟地址的实际内容在哪,这样当我们得到一个位于VMA地址范围的page fault时,内核可以从磁盘中读数据,并加载到内存中。