2017-10-18 20 views
0

J'essaie d'ajouter un appel système à xv6 qui fournit l'adresse physique traduite avec une adresse virtuelle. En combinant les définitions de fonctions suivantes, j'ai écrit un appel système. Fonctions utilisées:Comment obtenir pgdir en xv6?

static pte_t * 
walkpgdir(pde_t *pgdir, const void *va, int alloc)  -- vm.c 

char* 
uva2ka(pde_t *pgdir, char *uva) --vm.c 

Voici mon code:

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 (D'où j'invoque mon appel système)

#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(); 
} 

Fondamentalement, je prends l'adresse virtuelle comme argument de l'utilisateur et de le transmettre à mon appel système. Je récupère l'adresse virtuelle en utilisant argstr() dans mon appel système.

La partie où je suis bloqué est, je ne suis pas capable de comprendre comment initialiser pgdir (répertoire de page) dans ma fonction add_translate() dans proc.c.

Répondre

0

Pour la ligne: physical_address = (char *) P2V (PTE_ADDR (* pte)); Je pense que cela devrait être V2P, parce que ce que vous voulez est l'adresse physique, non? :)