如何在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.cadd_translate()函数中初始化pgdir(页面目录)。

对于行:physical_address =(char *)P2V(PTE_ADDR(* pte)); 我认为这应该是V2P,因为你想要的是物理地址,对不对? :)