如何在xv6中获得pgdir?
问题描述:
我试图添加一个系统调用到xv6,它提供给定虚拟地址的转换后的物理地址。结合下面的函数定义,我写了一个系统调用。功能使用:如何在xv6中获得pgdir?
static pte_t *
walkpgdir(pde_t *pgdir, const void *va, int alloc) -- vm.c
char*
uva2ka(pde_t *pgdir, char *uva) --vm.c
这里是我的代码:
proc.c
int addr_translate(char* virtual_address)
{
int physical_address;
pde_t *pgdir,*pgtab,*pde;
//must initialise pgdir
pde = &pgdir[PDX(virtual_address)];
if(*pde & PTE_P){
pgtab = (pte_t*)P2V(PTE_ADDR(*pde));
}
else
{
cprintf("\n PTE Not Present! - Invalid Virtual address\n");
return -1;
}
cprintf("\n ----------------- \n");
cprintf(" Page Directory Entry (PDE): %d\n",*pde);
cprintf(" PTE_P : %d\n",PTE_P);
cprintf("\n ----------------- \n");
//uva2ka
pte_t *pte;
pte = &pgtab[PTX(virtual_address)];
physical_address=(char*)P2V(PTE_ADDR(*pte));
cprintf(" --PHYSICAL ADDRESS-- %d\n",physical_address);
return 0;
}
sysproc.c
char*
sys_addr_translation(char *s)
{
argstr(0, &s);
addr_translate(s);
return s;
}
addr_translation.c(从那里我调用我的系统调用)
#include "types.h"
#include "stat.h"
#include "user.h"
int main(int argc,char *argv[])
{
printf(1,"\n ----ADDRESS TRANSLATION----\n");
char *virtual_addr;
virtual_addr=argv[1];
printf(1,"\n Entered virtual address: %s\n",virtual_addr);
printf(1,"\n Status from system call: %s",addr_translation(virtual_addr));
exit();
}
基本上,我走的是虚拟地址作为来自用户的参数,并将它传递给我的系统调用。我在系统调用中使用argstr()
来检索虚拟地址。
我被卡住的部分是,我无法理解如何在proc.c
的add_translate()
函数中初始化pgdir(页面目录)。
答
对于行:physical_address =(char *)P2V(PTE_ADDR(* pte)); 我认为这应该是V2P,因为你想要的是物理地址,对不对? :)