xv6 lab3 Page Table
简述
这个lab有三个task:
- 写一个打印页表内容的函数
- 给每个进程都创建一个内核页表,这个主要的优化点是
具体点,就是将用户态页表的映射也放到每个进程的内核页表中,那么从用户态传入到内核态的指针就可以直接按照内核页表解引用了
- 修改copyin/copyinstr两个函数,它们主要是用来从用户态拷贝数据到内核态,由于原来的内核页表没有存放用户态页表的映射,那么这两个函数就需要去查找用户页表,由于上一个task的修改,现在可以直接读取内核页表了,又由于内核页表是虚拟地址与物理地址直接映射,所有就等于是直接通过物理地址读取数据了,所以可以简化copyin/copyinstr
Print a page table
A kernel page table per process
有三个函数会涉及到进程用户态页表的修改:
fork
,fork的时候会将父进程的页表PTE与物理地址拷贝到fork出来的子进程,因为之后一般要执行exec
,这个子进程从父进程复制过来的页表一般就是trapframe
与trampoline
会在用户态页表中保存,trapframe
是在初始化进程的时候分配在用户页表的,分配空页表的时候会在用户态页表映射
trapframe
与trampoline
,
那么同样需要去将子进程的用户态页表复制到子进程的内核页表
exec
,exec是装载可执行文件(映像文件)的过程,也就是建立虚拟地址空间与可执行文件的映射,exec
会装载映像文件的.text
与.data
段到物理内存,同时写入用户态进程页表还会分配用户栈与guard页,也会写到用户态页表,
这些都需要复制到进程的新的内核态页表sbrk
,sbrk
对应的sys_sbrk
会调用growproc
,也就是扩充进程虚拟地址空间中的heap
,这个时候用户态页表会改变所以这些都需要复制到进程的新的内核态页表
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程