【问题标题】:Linux memory mappingLinux内存映射
【发布时间】:2013-09-02 11:52:48
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: memory-management linux-kernel x86


    【解决方案1】:

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

    2.) 我不确定您指的是哪些限制,您能否引用一些文字,以便我可以在书中找到该段落。

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

    “Linux Device Drivers”是一个很好的参考,但我也可以推荐“Understanding the Linux Virtual Memory Manager”,当然还有内核的源代码。

    【讨论】:

    • 2.是关于高内存。
    • 1.也是关于高内存的。那么如果内核从高内存配置(顶部虚拟 1gig 实际上是“低内存”)它们如何更新?
    猜你喜欢
    • 1970-01-01
    • 2014-02-15
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多