【发布时间】:2013-11-17 12:42:40
【问题描述】:
在虚拟内存概念中——每个进程维护自己的页表。此页表将虚拟地址映射到内核虚拟地址。此内核虚拟地址将地址转换为物理 RAM。我知道有一个内核虚拟地址 - vm area struct。这个 vm area struct 最终将这个地址映射到 Physical 地址。 当我做 cat /proc//maps - 我看到虚拟地址到物理地址的直接映射。因为它将地址映射到文件 - 使用 inode。因此,它看起来是硬盘上的地址、文件描述符、主次编号。 RAM上有一些地址。所以,我可以说我看不到虚拟地址映射到内核虚拟地址的表。我想看看那张桌子。我怎么能看到呢?它不应该在内核空间中。因为当进程访问内存时,假设内存 - 0x1681010 那么这应该被转换为内核虚拟内存地址。最后,这个地址应该被翻译成物理内存地址。
【问题讨论】:
-
物理地址在用户空间没有意义。每次你要求它时它都可能改变,或者根本不存在。
/proc/maps中的映射仅告诉您已为您的进程提供的虚拟地址空间区域。 -
在访问内存时没有从虚拟地址到“内核虚拟内存”的转换——这就是为什么你看不到这种转换,它不存在。只有虚拟内存到物理内存的转换正在进行。
-
好的,我已经提到了这个链接 - users.nccs.gov/~fwang2/linux/lk_addressing.txt 。此链接的摘录是“为了访问任何物理页面,该页面必须在进程的页表中 - 每个进程都有自己的页表。那是根据。” ----这意味着每个进程都维护自己的页表。如何将虚拟内存转换为物理地址。绝对它需要一个页表。它如何访问该页表?这个页表在哪里?用户空间不能访问内核空间——记住。这意味着页表应该在用户空间中。
标签: c++ c linux linux-kernel virtualization