在XV6中返回虚拟地址或物理地址?

问题描述 投票:0回答:1

KVMALLOC调用setUpKvm

    在setupkvm中,我们创建pgdir(直到现在我所知的Page Directory都包含其他页面表的指示)
  1. 然后我们去映射开始映射pagetables
  2. 示意调用walkpgdir,它可以通过pageDirectory,如果发现一个虚拟的物理映射,则返回virutal映射。
  3. 首先,我们在PGDIR中没有任何东西,因为我们刚刚创建了PGDIR并将填充它。
  4. 我们将通过代码的其他块,在那里我们使用kalloc并将地址存储在PGTAB中,这里要考虑的一件事是迄今为止没有虚拟内存的概念(我一直在Main中关注的是没有VM,直到现在),所以我认为PGTAB将是物理内存。
  5. 现在,如果PGTAB是物理内存
  6. *pde = V2P(pgtab) | PTE_P | PTE_W | PTE_U;
  7. 为什么我们使用V2P,虚拟到PGTAB的物理。这是我的怀疑。
  8. 如果您需要Walkpgdir的代码,就在这里,
  9. static pte_t * walkpgdir(pde_t *pgdir, const void *va, int alloc) { pde_t *pde; pte_t *pgtab; pde = &pgdir[PDX(va)]; if(*pde & PTE_P){ pgtab = (pte_t*)P2V(PTE_ADDR(*pde)); } else { if(!alloc || (pgtab = (pte_t*)kalloc()) == 0) return 0; // Make sure all those PTE_P bits are zero. memset(pgtab, 0, PGSIZE); // The permissions here are overly generous, but they can // be further restricted by the permissions in the page table // entries, if necessary. *pde = V2P(pgtab) | PTE_P | PTE_W | PTE_U; } return &pgtab[PTX(va)]; }
  10. ,嘿,如果我在解释内容时犯了一个错误,请原谅我,我只是告诉我我所理解的内容,我只是在改变各种文件并告诉我我所理解的内容。如果我错了,请纠正我。
  11. 您的混乱来自于以下假设:
    pgtab
    已经是物理内存地址。
  12. kalloc()
确实从物理内存返回页面,但返回的地址映射在内核的虚拟地址空间中。因此,

pgtab

是一个指向物理内存的虚拟地址。
Source

memory x86 operating-system kernel xv6
1个回答
0
投票

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.