Linux内存映射

时间:2013-08-29 21:27:01

标签: memory-management linux-kernel x86

我对linux内存管理(假设x86 32位平台)提出了一些问题

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

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

      

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

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

1 个答案:

答案 0 :(得分:0)

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

2。)我不确定你的意思是什么,你能引用一些文字,以便我可以在书中找到这段经文。

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

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