0

我正在尝试向 xv6 添加一个系统调用,该系统调用在给定虚拟地址的情况下提供翻译后的物理地址。结合下面的函数定义,我写了一个系统调用。使用的功能:

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;

   }

系统进程

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()系统调用中使用的虚拟地址。

我被卡住的部分是,我无法理解如何在我的add_translate()函数中初始化 pgdir(页面目录) proc.c

4

2 回答 2

0

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

于 2017-11-07T05:26:02.810 回答
0

您可以使用struct proc *curproc = myproc();,然后您就可以通过curproc->pgdir.

于 2018-05-09T01:54:02.563 回答