2016-10-11 5 views
1

ここに私の 'translate()'がproc.cにあります 私はポインタの仮想アドレスを与えられた物理アドレスを取得したいと思いますが、 proc.h.に住んでいるグローバル変数procありますxv6でポインタのページディレクトリを取得する方法

int translate(void* vaddr) 
{ 
     cprintf("vaddr = %p\n",vaddr); 
int paddr; 
pde_t *pgdir; 
pte_t *pgtab; 
pde_t *pde; 
pte_t *pte; 

pgdir = (pde_t*)cpu->ts.cr3; 
cprintf("page directory base is: %p\n",cpu->ts.cr3); 
pde = &pgdir[PDX(vaddr)]; 
if(*pde & PTE_P){ 
pgtab = (pte_t*)P2V(PTE_ADDR(*pde)); 
}else{ 
cprintf("pde = %d\n",*pde); 
cprintf("PTE_P = %d\n",PTE_P); 
cprintf("pte not present\n"); 
return -1; 
} 
pte = &pgtab[PTX(vaddr)]; 
paddr = PTE_ADDR(*pte); 
    cprintf("the virtual address is %p\n",vaddr); 
    cprintf("the physical address is %d\n",paddr); 

    return 0; 

} 

答えて

0

...(ページディレクトリ)ポインタpgdirを取得

proc.h, lines 34 to 43 

// Per-CPU variables, holding pointers to the 
// current cpu and to the current process. 
// The asm suffix tells gcc to use "%gs:0" to refer to cpu 
// and "%gs:4" to refer to proc. seginit sets up the 
// %gs segment register so that %gs refers to the memory 
// holding those two variables in the local cpu's struct cpu. 
// This is similar to how thread-local variables are implemented 
// in thread libraries such as Linux pthreads. 
extern struct cpu *cpu asm("%gs:0");  // &cpus[cpunum()] 
extern struct proc *proc asm("%gs:4");  // cpus[cpunum()].proc 

あなたはproc.cでproc->pgdirを参照することができるか、どこにもそのproc.hが含まれています。

あなたの翻訳機能の価値は、私にはよく見えます。

2

引数を読むには、argint()またはargptr()を使用する必要があります。

関連する問題