Java教程

xv6 lab3

本文主要是介绍xv6 lab3,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

https://pdos.csail.mit.edu/6.S081/2020/labs/pgtbl.html

简述

这个lab有三个task:

  1. 写一个打印页表内容的函数
  2. 给每个进程都创建一个内核页表,这个主要的优化点是具体点,就是将用户态页表的映射也放到每个进程的内核页表中,那么从用户态传入到内核态的指针就可以直接按照内核页表解引用了
  3. 修改copyin/copyinstr两个函数,它们主要是用来从用户态拷贝数据到内核态,由于原来的内核页表没有存放用户态页表的映射,那么这两个函数就需要去查找用户页表,由于上一个task的修改,现在可以直接读取内核页表了,又由于内核页表是虚拟地址与物理地址直接映射,所有就等于是直接通过物理地址读取数据了,所以可以简化copyin/copyinstr

A kernel page table per process

有三个函数会涉及到进程用户态页表的修改:

  • fork,fork的时候会将父进程的页表PTE与物理地址拷贝到fork出来的子进程,因为之后一般要执行exec,这个子进程从父进程复制过来的页表一般就是trapframetrampoline会在用户态页表中保存,trapframe是在初始化进程的时候分配在用户页表的,分配空页表的时候会在用户态页表映射trapframetrampoline
    那么同样需要去将子进程的用户态页表复制到子进程的内核页表
  • exec,exec是装载可执行文件(映像文件)的过程,也就是建立虚拟地址空间与可执行文件的映射,exec会装载映像文件的.text.data段到物理内存,同时写入用户态进程页表还会分配用户栈与guard页,也会写到用户态页表,

    这些都需要复制到进程的新的内核态页表
  • sbrksbrk对应的sys_sbrk会调用growproc,也就是扩充进程虚拟地址空间中的heap,这个时候用户态页表会改变所以这些都需要复制到进程的新的内核态页表

Simplify copyin/copyinstr

这篇关于xv6 lab3的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!