gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:11 25 4
gpt4 key购买 nike

似乎在Windows 32位上,内核会从总共4G的用户虚拟内存空间中预留1G的虚拟内存,并将内核空间的部分映射到这1G空间中。

所以我的问题是:

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

我觉得

cat /proc/pid/map

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

谢谢!

最佳答案

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

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

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

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

看看这个 PDF。它是我们在类(class)中所做的所有实验的编译版本。 http://www.atc.us.es/asignaturas/tpbn/PracticasTPBN2011.pdf

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

文字是西类牙语,但我敢肯定,如果您有不明白的地方,您可以使用翻译器或类似的工具。本实验假定学生之前已经了解了分页系统的工作原理以及如何解释目录和页面条目的布局。

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

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

关于linux - 内核空间是否映射到 Linux x86 上的用户空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20792158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com