gpt4 book ai didi

c - 了解 pagedir_get_page() 中用户、内核和物理地址之间的关系

转载 作者:太空宇宙 更新时间:2023-11-03 23:37:07 24 4
gpt4 key购买 nike

我对以下评论感到困惑:

/* Looks up the physical address that corresponds to user virtual
address UADDR in PD. Returns the kernel virtual address
corresponding to that physical address, or a null pointer if
UADDR is unmapped. */

我理解第一句是查找实际物理地址,但是我不明白为什么返回该地址对应的内核虚拟地址。总之,uaddr既然是用户虚拟地址,那为什么会和内核虚拟地址有关呢?

void *
pagedir_get_page (uint32_t *pd, const void *uaddr)
{
uint32_t *pte;

ASSERT (is_user_vaddr (uaddr));

pte = lookup_page (pd, uaddr, false);
if (pte != NULL && (*pte & PTE_P) != 0)
return pte_get_page (*pte) + pg_ofs (uaddr);
else
return NULL;
}

提前致谢。

最佳答案

评论说的地址一共有三种:

  1. 物理地址:这是真实地址,I.E.计算机物理内存中的真实准确位置。
  2. 内核虚拟地址:这是内核看到该物理地址的虚拟地址。
  3. 用户虚拟地址:这是用户空间程序看到该物理地址的虚拟地址。

所以,对于简单的 ASCII 艺术,情况是这样的:

 User space    
program 1 Kernel RAM
+-----------+ +-----------+ +-----------+
| 0xAAAA000 | | 0x1212000 | | 0xA7EF000 |
| 0xBBBB000 | | 0x4398000 | | 0x0001000 |
| 0xCCCC000 |<---| 0x87FF000 |<---| 0x1234000 |
+-----------+ | ... | | ... |
| ... | | ... |
User space | ... | | ... |
program 2 | ... | | ... |
+-----------+ | ... | | ... |
| 0xDDDD000 | | 0x7FF8000 | | 0x3FFF000 |
| 0xEEEE000 | | 0xABCD000 | | 0x2010000 |
| 0xFFFF000 |<---| 0x98AE000 |<---| 0xA89A000 |
+-----------+ +-----------+ +-----------+

给定一个有效的用户空间虚拟地址,该函数进行查找并检索关联的内核空间虚拟地址。可以完成此查找,因为它们都指向相同的物理地址,并且它们之间存在一对一的对应关系。查找是通过 Kernel Page Table 完成的,这可能就是对 lookup_page(...)pte_get_page(...) 的两个调用所做的。

关于c - 了解 pagedir_get_page() 中用户、内核和物理地址之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57186091/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com