内核空间是否映射到Linux x86上的用户空间?

时间:2013-12-26 22:36:10

标签: linux memory linux-kernel memory-layout windows-kernel

似乎在Windows 32位上,内核将从完全4G用户虚拟内存空间中保留1G虚拟内存,并将部分内核空间映射到此1G空间。

所以我的问题是:

  1. 32位Linux上是否有类似的情况?
  2. 如果是这样,我们怎样才能看到整个内存布局?
  3. 我认为

    cat /proc/pid/map
    

    只能看到某个进程的用户空间布局..

    谢谢!

2 个答案:

答案 0 :(得分:5)

  

32位Linux上是否有类似情况?

是。在32位Linux上,默认情况下,内核保留了四分之一的地址空间(从C0000000到内存顶部的1G)供自己使用。

  

如果是这样,我们怎样才能看到整个内存布局?

你做不到。 /proc/pid/maps仅显示在用户空间中存在的映射。用户空间应用程序无法访问内核内存,因此未显示内存。

请记住使用这种安排的原因 - 当内核处于活动状态时,它需要能够安装自己的映射,同时仍然保持用户空间映射处于活动状态(例如,它可以从中复制数据)用户空间)。它通过为自己保留高内存范围来实现这一目标。

内核中内存映射的位置与内核本身之外的任何内容都无关,因此除了意外或某些调试消息之外,它根本不会暴露给用户空间。

答案 1 :(得分:3)

实际上,在没有/3G启动选项的32位Windows上,内核映射到线性地址空间的前2GB,为用户进程留下2GB。

Linux做了类似的事情,但它将内核映射到线性空间的前1GB,从而为用户进程留下了3GB。

我不知道你是否可以通过使用/ proc文件系统来查看整个内存布局。对于我为学生设计的实验室,我创建了一个小型设备驱动程序,允许用户查看物理内存地址,并获取多个控制寄存器的内容,例如CR3(目录页基址)。

通过使用这两个操作,可以遍历当前进程的目录页面(正在执行此操作的目录页面)并查看哪些页面存在,哪些页面由用户和内核拥有,或者只是通过内核,哪些是读/写或只读等。有了这些信息,他们必须显示一个显示内存使用情况的地图,包括内核空间。

看一下这篇PDF。这是我们在课程中所做的所有实验的编译版本。 http://www.atc.us.es/asignaturas/tpbn/PracticasTPBN2011.pdf

在PDF的第36页(文档的第30页),您将看到内存映射的外观。这是从实验#3进行练习#3.2的结果。

该文字是西班牙语,但我相信如果有些事情你无法理解,你可以使用翻译或类似的东西。本实验假设学生之前已经阅读过分页系统如何工作以及如何解释目录和页面条目的布局。

地图是这样的。 16x64块。块中的每个单元代表当前进程虚拟地址空间的4MB。地图应该是立体的,因为有4MB区域由具有1024个条目(页面)的页面表描述,并且并非所有页面都可以存在,但为了保持地图清晰,练习要求用户折叠这些区域,显示描述当前页面的第一个页面条目的内容,希望该页面表中的所有子后续页面共享相同的属性(实际上可能是也可能不是)。

此映射与内核2.6.X一起使用。其中未使用PAE,并使用PSEPAEPSE是来自控制寄存器CR4的两位字段)。 PAE启用2MB页面,PSE启用4MB页面。总共有4KB页面。

. : PDE not present, or page table empty.
X : 4MB page, supervisor.
R : 4MB page, user, read only.
* : 4MB page, user, read/write.
x : Page table with at least one entry describing a supervisor page.
r : Page table with at least one entry describing an user page, read only.
+ : Page table with at least one entry describing an user page, read/write.

................................r...............................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
...............................+..............................+.
xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..x...........................xx

你可以看到有3GB内存的空间很大,在这种情况下几乎是空的(这个过程只是一个小C应用程序,使用不到4MB,全部包含在页表中,其第一个页面是只读页面,假定是程序代码的一部分,或者可能是静态字符串)。

在3GB边框附近有两个小区域读/写,可能属于用户程序加载的共享库。

最后4行(256个目录条目)几乎全部属于内核。实际存在和使用了224个条目。这些映射了第一个896MB的物理内存,它是内核所在的空间。在内存超过896MB的系统中,内核使用最后32个条目访问超过896MB标记的物理内存。