这一个实验主要是学习XV6的页表(分页机制),关于分页机制的相关内容已经写在XV6学习 (3)里面了。 代码放在Github上。 Print a page table (easy) 这一个就是要实现一个vmprint()函数来遍历页表并打印,可以仿照freewalk()函数来写。 void prin
VA+=PGSIZE得到下一个页面的虚拟地址#ifdef LAB_PGTBL uint64 sys_pgaccess(void) { uint64 va; int page_num; uint64 user_bitmask_addr; if(argaddr(0, &va) < 0) return -1; if(argint(1, &page_num) < 0) return -1; if(argaddr(2,...
在sysproc.c中完善sys_pgaccess(): #ifdef LAB_PGTBLuint64sys_pgaccess(void){// lab pgtbl: your code here.// get argumentuint64buf;intnumber;uint64ans;if(argaddr(0,&buf)<0)return-1;if(argint(1,&number)<0)return-1;if(argaddr(2,&ans)<0)return-1;returnpgaccess((void*)buf,number,...
kernel/vm.c:vmprint( )通过vmprint_pgtbl( )实现对页表的遍历。 vmprint()通过检查PTE_V确认页表项是否有效,根据页表项层级打印相应个数的".."。值得注意的是,xv6页表中,只有叶子节点页表项设置了RWX权限,因此可以通过这一特点来判断是否该递归遍历下一级页表。
intsys_pgaccess(void){// lab pgtbl: your code here.intn;// number of page// bufAddr: the first user page// abitsAddruint64bufAddr,abits,bitsmask=0;// 依次将系统调用的参数取出并保存在相应的变量中argaddr(2,&abits);argint(1,&n);argaddr(0,&bufAddr);structproc*p=myproc();for(...
//memlayout.h#ifdefLAB_PGTBL#defineUSYSCALL(TRAPFRAME-PGSIZE)structusyscall{intpid;// Process ID};#endif//1 在proc结构体中增加一个字段structusyscall*usyscall;//2 进程初始化时分配空间并赋值staticstructproc*allocproc(void){structproc*p;//...//Allocate a shared page.if((p->usyscall=(struc...
使用下面的命令切换到 pgtbl 分支。 $ git fetch $ git checkout pgtbl $ make clean 1. 2. 3. 推荐新建文件夹,重新使用下面的命令下载代码作为实验 3 工作区。 $ git clone git://g.csail.mit.edu/xv6-labs-2020 $ git checkout ...
由此可知在sys_pgacess()中需要传递三个参数,依次分别为64位地址、32位整型、64位地址:(此处我将内核pagacess函数参数的定义与用户保持一致) int sys_pgaccess(void) { // lab pgtbl: your code here. int npage; uint64 start_addr, res_addr; argaddr(0, &start_addr); argint(1, &npage); argad...
课程地址:https://pdos.csail.mit.edu/6.S081/2020/schedule.html Lab 地址:https://pdos.csail.mit.edu/6.S081/2020/labs/pgtbl.html 我的代码地址:https://github.com/Miigon/my-xv6-labs-2020/tree/pgtbl Commits: https://github.com/Miigon/my-xv6-labs-2020/commits/pgtbl 本文中代码注释是...
实验目的旨在优化系统调用速度,并涉及进程创建与页表映射。实验要求每个新进程创建时,映射一个只读页面存储定义在memlayout.h的usyscall结构。此页面初始存储当前进程PID,ugetpid()函数自动使用USYSCALL映射,实验成功通过pgtbltest测试将获得满分。实验实施过程中,注意到在页面映射时不能仅包含PTE_R位,需...