如何查看虚拟内存中每个进程维护的页表 - Linux?

时间:2013-11-17 12:42:40

标签: c++ c linux linux-kernel virtualization

在虚拟内存概念中 - 每个进程都维护自己的页表。此页表将虚拟地址映射到内核虚拟地址。此内核虚拟地址将地址转换为物理RAM。我知道有一个Kernel Virtual adddres - vm area struct。此vm区域结构最终将此地址映射到物理地址。 当我做cat / proc // maps时 - 我看到了虚拟地址到物理地址的直接映射。因为它将地址映射到文件 - 使用inode。因此,它看起来它是硬盘上的地址,文件描述符,主要次要编号。 RAM上有一些地址。所以,我可以说我看不到虚拟地址映射到内核虚拟地址的表。我想看看那张桌子。我怎么能看到这个?它不应该在内核空间中。因为进程正在访问时让我们说内存 - 0x1681010然后这应该被转换为内核虚拟内存地址。最后,该地址应转换为物理内存地址。

1 个答案:

答案 0 :(得分:5)

不,Linux kernel维护进程页表(但不保留进程本身)。 Processes仅通过他们的virtual memory看到address space。进程使用一些syscalls,例如mmap(2)execve(2),以更改其地址空间。

物理地址和页表以及处理和管理MMU是内核的业务,它实际上提供了一些“abstract machine”(使用虚拟地址空间,系统调用作为原子基本操作)等等...)用户应用程序。应用程序看不到原始(x86)硬件,而只看到内核给出的user mode。某些硬件资源和指令不可用(它们仅在user space中运行)。

页面表由内核管理,实际上各种进程可能使用不同的 - 或者有时相同的页面表。 (因此,由kernl管理的context switches可能需要重新配置MMU)。您并不关心(并且用户进程看不到页表)内核将对其进行管理。

不,/proc/self/maps没有显示任何有关物理地址的信息,只显示虚拟地址。允许内核将进程从一个核心移动到另一个核心,以便随时将页面从一个物理(非虚拟)地址移动到另一个,等等。并且应用程序通常看不到这一点(他们可能会使用mincore(2)getcpu(2)和通过proc(5)进行查询...)

应用程序不应该关心物理内存或interrupts,例如page faults(只有内核关心这些;有时通过发送信号)。

虚拟到物理地址转换发生在MMU中。通常,它是成功的(可能透明地访问页表),并且处理器在总线上向RAM发送转换的物理地址(对应于由用户模式机器指令处理的某个虚拟地址)。当MMU无法处理它时,会发生页面错误,由内核处理(可以交换某些页面,发送SIGSEGV,执行上下文切换等等。) < / p>

另请参阅processor architectureinstruction setpage tablepagingtranslation lookaside buffercachex86和{{ 3}} wikipages(并按照我给你的所有链接)。