Bootstrap

MIT6.S081学习总结-lab3:page tables

lab3 主要是页表相关,难度突然提高了好多,遇到了无数个坑,太难了。

打印页表

第一个进程启动时打印页表内容
在这里插入图片描述
内容分析:
… 0:
… … 0:
… … … 0:标志位0x1f,用户可以访问,是代码,全局变量页表
… … … 1:标志位0x0f,用户不可以访问,就是守护页,因为栈是往下增长的,防止用户栈增长到守护页,最多只能到栈底
… … … 2:标志位0x1f,表示堆栈
… 255:
… … 511:
… … … 510:标志位0x07,可读写,是trapframe页,用来恢复和保存寄存器的页
… … … 511:标志位0x0b,可执行可读,trampoline页
实现:
kernel/vm.c里添加,递归实现即可
在这里插入图片描述

每个进程一张内核页表

目前xv6的实现里,每个进程只有一张独立的用户地址空间页表,共享一张内核页表,这样的话每次内核不能直接使用用户指针,只能先将其通过用户页表转为物理地址。本节及下一节要做的是使内核可以直接解引用用户指针,就是可以直接通过虚拟地址访问。
本节要做的就是为每个进程复制一个内核页表。

实现

省略了 添加函数到defs.h的步骤,这一节一些实现与下一节相关。

  1. 首先
;