2

我有几个关于 linux 内存管理的问题(假设 x86 32 位平台)

  1. 默认情况下,所有进程的前 1Gig 虚拟地址映射到内核区域。理论上内核可以使用vmalloc从高内存映射额外的内存。我的问题是所有用户进程的页表会发生什么,我假设他们应该获得有关内核内存分配的更新?(可能是当内核处于进程上下文时内存将被使用)。

  2. 有人可以解释X86逻辑地址映射限制来自哪里吗?在“linux设备驱动程序”第15章中,据说映射逻辑地址有限制,但没有深入解释:

    在许多情况下,即使是 32 位处理器也可以处理超过 4 GB 的物理内存。然而,多少内存可以直接映射到逻辑地址的限制仍然存在。只有内存的最低部分(最多 1 或 2 GB,取决于硬件和内核配置)具有逻辑地址;其余的(高内存)没有。

  3. 内核何时切换到自己的页表(不包括启动时间)?当它在进程上下文和中断上下文中时,它使用用户模式进程页表。内核线程也使用进程页表。

4

1 回答 1

0

1.) 只有一组 256 页表映射内核的 1GiB 区域。每个用户空间页目录的前 256 个条目都指向这些页表。因此,如果内核更改了虚拟映射,所有用户空间进程也会得到更新。

2.)我不确定你的意思是什么限制,你能引用一些文字,这样我就可以找到书中的段落。

3.) 当一个进程,比如 QEMU,用 kvm 启动一个虚拟 CPU 时,内核会换掉进程的页表,即使它没有让给另一个进程。这样的地方可能还有更多,但总的来说,我认为没有“内核页表”这样的东西。所有进程页表都已经映射了内核内存,因此将它们切换出去似乎很浪费。

《Linux 设备驱动程序》是一个很好的参考,但我也可以推荐《了解 Linux 虚拟内存管理器》,当然还有内核的源代码。

于 2013-08-30T04:22:08.610 回答