一尘不染

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

linux

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

所以我的问题是:

  1. 在32位Linux上是否有类似情况?
  2. 如果是这样,我们如何看到整个内存布局?

我认为

cat /proc/pid/map

只能看到某些过程的用户空间布局。

谢谢!


阅读 248

收藏
2020-06-07

共1个答案

一尘不染

实际上,在32位Windows上,如果没有/3G引导选项,内核将映射到线性地址空间的前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的当前进程虚拟地址空间。地图应该是三维的,因为页面表用1024个条目(页面)描述了4MB区域,并且可能不会显示所有页面,但是为了保持地图清晰,练习要求用户折叠这些区域,显示了描述当前页面的第一个页面条目的内容,希望该页面表中的所有后续页面都共享相同的属性(实际上可能正确也可能不正确)。

该映射与内核2.6.X一起使用。其中PAE不使用和PSE使用(PAE并且PSE是控制寄存器中的两个位字段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的物理内存,它是内核所在的空间。在RAM超过896MB的系统中,内核使用最后32个条目访问超出896MB标记的物理内存。

2020-06-07