这一个实验主要是学习XV6的页表(分页机制),关于分页机制的相关内容已经写在XV6学习 (3)里面了。 代码放在Github上。 Print a page table (easy) 这一个就是要实现一个vmprint()函数来遍历页表并打印,可以仿照freewalk()函数来写。 void prin
在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,...
but with trampoline pages.pagetable_tproc_pagetable(structproc *p){// map the trampoline code (for system call return)// at the highest user virtual address.// only the supervisor uses it, on the way// to/from user space, so not PTE_U.if(mappages(pagetable, TRAMPOLINE, PGSIZE...
由于这些页是连续的,需要获取下一个的虚拟页的起始地址为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...
intsys_pgaccess(void){// lab pgtbl: your code here.uint64base,mask;intlen;if(argaddr(0,&base)<0){return-1;}if(argint(1,&len)<0){return-1;}if(argaddr(2,&mask)<0){return-1;}structproc*myp=myproc();uint64va=PGROUNDDOWN((uint64)base);charkernalbuf[256]={0};if(len>256*8...
xv6 拥有一个单独的内核页表供所有进入内核的进程使用,该页表与实际物理内存直接映射,不需要转换地址。 但如果想使用用户态的一个地址时,当内核态需要使用一个用户态指针时,需要翻译转换虚拟地址为物理地址。因此,本实验的目标是给每个进程创建一个内核态页表 ...