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

标签 c++ c linux linux-kernel virtualization

在虚拟内存概念中——每个进程维护自己的页表。该页表将虚拟地址映射到内核虚拟地址。此内核虚拟地址将地址转换为物理 RAM。我知道有一个 Kernel Virtual addres - vm area struct。这个vm area struct最终将这个地址映射到Physical地址。 当我执行 cat/proc//maps - 我看到虚拟地址到物理地址的直接映射。因为它将地址映射到文件——用inode。因此,它看起来是硬盘上的地址、文件描述符、主次编号。 RAM 上有一些地址。所以,我可以说我看不到虚拟地址映射到内核虚拟地址的表。我想看看那张 table 。我怎么能看到?它不应该在内核空间中。因为当进程访问内存时 - 0x1681010 那么这应该被转换为内核虚拟内存地址。最后,这个地址应该被翻译成物理内存地址。

最佳答案

不,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,进行上下文切换等...)

另见 processor architecture , instruction set , page table , paging , translation lookaside buffer , cache , x86x86-64维基页面(并点击我给你的所有链接)。

关于c++ - 如何查看虚拟内存中每个进程维护的页表 - Linux?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20030776/

相关文章:

C - 从字符串中获取 CLEAN 数字变量

php - yii 多记录多表单多模型

linux - Linux Ubuntu 14.04下安装Scratch 2

c++ - CDT Kepler Eclipse 上的 "Launch failed. Binary not found."错误

c++ - 关于 "circular reference",我使用了 weak_ptr 但内存泄漏仍然发生

c - 我应该在中断例程中检索 SPI 数据吗?

c - 将空字符添加到非空终止字符串有什么问题?

java - 错误 : could not find libjava. 所以,错误:找不到 Java 2 运行时环境

C++检查变量以解决越界问题

c++ - 如何用模板解决这个循环继承问题?