最难且重量级的一项放在lab3,后面的实验就都是水怪实验。创建一个内核页表,我们为proc额外初始化一个k_pagetable与kstack_pa: proc.h: struct proc { struct spinlock lock; // p->lock must be held when using these: enum procstate state; // Process state struct proc *parent; // Parent process ...
定义函数vmprint(struct pagetable* page_table) 打印的格式: pagetable0x0000000087f6e000..0:pte0x0000000021fda801pa0x0000000087f6a000...0:pte0x0000000021fda401pa0x0000000087f69000...0:pte0x0000000021fdac1fpa0x0000000087f6b000...1:pte0x0000000021fda00fpa0x0000000087f68000...2:pte0x0000000021fd...
Print a page table A kernel page table per process 有三个函数会涉及到进程用户态页表的修改: fork,fork的时候会将父进程的页表PTE与物理地址拷贝到fork出来的子进程,因为之后一般要执行exec,这个子进程从父进程复制过来的页表一般就是trapframe与trampoline会在用户态页表中保存,trapframe是在初始化进程的时候分配...
voidfreewalk(pagetable_tpagetable){// there are 2^9 = 512 PTEs in a page table.for(inti=0;i<512;i++){pte_tpte=pagetable[i];//符合该条件的为页目录if((pte&PTE_V)&&(pte&(PTE_R|PTE_W|PTE_X))==0){// this PTE points to a lower-level page table.uint64child=PTE2PA(pte)...
pagetable_t类型指针会直接指向顶级页表地址; 如果$n>0$,调用uvmalloc()分配内存让用户进程内存增长n/PGSIZE个 Page(PGSIZE=4096B); 如果$s<0$,调用uvmdealloc()分配内存让用户进程内存缩小n/PGSIZE个 Page。 void * kalloc(void):分配一个 page 大小的物理内存 ...
在实现6.S081 Lab3过程中,需要对xv6页表有一定的掌握,因此写了这份源码分析。 一、基本原理 1 页表介绍 1.1 地址范围 xv6系统是64位的,但是地址只用到了39位:9+9+9+12,地址空间512G,三级页表,页表项占8B,每一页存放512项。 每一个页表项(Page Table Entry)占8B,包含44位物理页号(Phsical Page Number...
这次实验不能像做前三次实验一样吃老本莽过去了,需要提前阅读 xv6 book 的 Scheduling 一章。但还没看过 Interrupts and device drivers 和 Locking 这两章...
uvmunmap(pagetable, USYSCALL, 1, 0); Lab3_2 Print a page table 在这部分实验中,您将向 xv6 添加一个新功能,该功能通过检查 RISC-V 页表中的访问位来检测并向用户空间报告此信息。定义一个名为 vmprint() 的函数。 它应该接受一个 pagetable_t 参数,并以下面描述的格式打印该页表。
Lab3: Page Tables Lab3这个将探索页表并对其进行修改,以简化将数据从用户空间复制到内核空间的函数。实验主要涉及了解xv6物理地址和虚拟地址的转换和寻址, 内核态下的内存地址和用户态下的内存地址的差别等。首先是实现一个 vmprint() 函数,该函数接收一个 pagetable_t 的参数,然后打印该页表,具体格式参考图片中...
XV6是由 MIT 开发的,⽤于操作系统课程实践教学的操作系统。 XV6(2022版)共包含 10 个 Lab : Lab0:Utilities Lab1:System calls Lab2:Page tables Lab3:Traps Lab4:Copy on-write Lab5:Multithreading Lab6:Network driver(选做) Lab7:Lock Lab8:File system ...