xv6 lab3
作者:互联网
简述
这个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
,这个时候用户态页表会改变所以这些都需要复制到进程的新的内核态页表
Simplify copyin/copyinstr
标签:映射,exec,用户,xv6,lab3,内核,进程,页表 来源: https://www.cnblogs.com/mlmz/p/16089077.html