通过虚拟地址VA确定PTE(walk来完成) 检查PTE的标志位PTE_A是否为1,1表示被访问过 记得将PTE_A清0,以防影响再次调用sys_pgaccess时影响判断 VA+=PGSIZE得到下一个页面的虚拟地址#ifdef LAB_PGTBL uint64 sys_pgaccess(void) { uint64 va; int page_num; uint64 user_b
在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,...
这一个实验主要是学习XV6的页表(分页机制),关于分页机制的相关内容已经写在XV6学习 (3)里面了。 代码放在Github上。 Print a page table (easy) 这一个就是要实现一个vmprint()函数来遍历页表并打印,可以仿照freewalk()函数来写。 void prin
由于这些页是连续的,需要获取下一个的虚拟页的起始地址为va+=PGSIZE 使用copyout将abits变量传回用户空间,注意copyout这个参数设置。 ---sysproc.c---intsys_pgaccess(void){structproc*p=myproc();uint64base,mask;unsignedintabits=0;intlen;argaddr(0,&base);argint(1,&len);//base is virtual adddres...
开始日期:22.3.27 操作系统:Ubuntu20.0.4 Link:Lab Pgtbl 个人博客:Memory Dot my github repository: duilec/MITS6.081-fall2021/tree/pgtbl Lab Pgtbl 写在前面 usertests bigd
int sys_pgaccess(void) { // lab pgtbl: your code here. uint64 base, mask; int len; if (argaddr(0, &base) < 0) { return -1; } if (argint(1, &len) < 0) { return -1; } if (argaddr(2, &mask) < 0) { return -1; } struct proc *myp = myproc(); uint64 va =...
xv6 拥有一个单独的内核页表供所有进入内核的进程使用,该页表与实际物理内存直接映射,不需要转换地址。 但如果想使用用户态的一个地址时,当内核态需要使用一个用户态指针时,需要翻译转换虚拟地址为物理地址。因此,本实验的目标是给每个进程创建一个内核态页表 ...