【问题标题】:How can I see a page-table maintained by each process in Virtual Memory - Linux?如何查看虚拟内存中每个进程维护的页表 - Linux?
【发布时间】: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


【解决方案1】:

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

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

页表是由内核管理的,实际上不同的进程可能使用不同的——或者有时是相同的——页表。 (所以由内核管理的context switches 可能需要重新配置MMU)。你不在乎,(并且用户进程看不到页表)内核会管理它们。

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

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

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

另请参阅processor architectureinstruction setpage tablepagingtranslation lookaside buffercachex86x86-64 维基页面(并点击我给你的所有链接)。

【讨论】:

  • 我在顶部添加了一个 cmets。我对答案不满意。我已经提到了一个链接。如果页表在内核空间中,那么在内核空间上运行的进程如何访问页表?假设 char * a; memcpy(a,13,1); . a的地址是什么。如果我们打印,我们会得到虚拟地址。但实际上,在地址 a 上复制时,它会获得 RAM 上的物理地址。因此,它需要一个页表来将该地址转换为物理地址。它不能访问内核空间——记住用户不能直接访问内核空间。它需要系统调用。
  • 进程无法访问内核空间。只有内核在内核空间中工作。用户进程仅通过系统调用与内核交互。用户进程看不到物理地址,所以不要关心它们。
  • 进一步补充,我不认为每次内存访问都会有来自用户空间的系统调用来转换地址。
  • 否,由 MMU 处理。内核处理页面错误。大多数访问直接(通过 MMU)到内存,但它们使用的是虚拟地址(MMU 已成功将其转换为某个物理地址)。
  • 在 Basile,如果你这样说,我同意,那么进程内存地址如何转换为物理地址?只是从过程的角度思考。一个进程正在尝试访问一个虚拟地址,比如 0x1681010。这应该被翻译成物理地址。翻译将如何发生,映射表-页表在哪里?如果它在内核中,那么它需要调用系统调用。如果没有,那么我应该能够通过用户空间查看页表。
猜你喜欢
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2013-12-13
  • 2016-04-29
相关资源
最近更新 更多