2009-02-23 22 views
6

在linux内核中,mem_map是包含所有“结构页”描述符的数组。这些页面包含lowmem中的128MiB内存,用于动态映射highmem。为什么我们需要x86上的zone_highmem?

由于lowmem大小为1GiB,因此mem_map阵列仅有1GiB/4KiB = 256KiB条目。如果每个条目大小是32字节,则mem_map存储器大小= 8MiB。但是,如果我们可以使用mem_map来映射所有4GiB物理内存(如果我们在x86-32上有很多物理内存),那么mem_map数组将占用32MiB,这不是很多内核内存(或者我错了吗?) 。

所以我的问题是:为什么我们需要使用128MiB低间接HIGHMEM映射摆在首位?换句话说,为什么不直接在内核空间中映射所有这些最大4GiB物理内存(如果可用)呢?

注:如果我的上述内核源代码的理解是错误的,请大家指正。谢谢!

回答

1

看这里:http://www.xml.com/ldd/chapter/book/ch13.html

内核内存不足是“真正的”存储器映射,讨论与x86 32位指针。

内核高存储器是“虚拟”的内存映射,以在x86虚拟结构解决。

你不想把它全部映射到内核地址空间,因为你不能总是解决这一切,你最需要你的内存虚拟内存段(虚拟页面映射的进程空间。 )

至少,我就是这么读的。哇,这是一个复杂的问题,你问。

要投入更多的混乱,章节对一些PCI设备不能够处理32位的空间,这是我以前的评论的起源13会谈:

在x86上,某些内核内存使用量限制为由于DMA寻址问题,第一个千兆字节的内存。我对这个主题并不是100%熟悉,但是PCI总线上有一个DMA兼容模式。这可能是你正在看的。

0

3.6 GB使用物理地址扩展,也就是通常需要在大多数现代的x86板时,特别是与内存热插拔不是天花板。

0

或换句话说,为什么不直接在内核空间映射所有那些最大的4GiB物理内存(如果可用)呢?

一个原因是用户空间:每个用户空间进程都有自己的虚拟地址空间。假设你在x86上有4Gb的RAM。因此,如果我们建议内核拥有1Gb内存(〜800直接映射+〜200 vmalloc),则所有其他〜3Gb应分配在动态用户空间中的进程之间分配的动态。那么,如何在几个地址空间中直接映射4Gbs?

为什么我们需要x86上的zone_highmem?

的道理是一样的。内核预留的低内存只有〜800Mb。所有其他内存将仅在需要时分配并与特定的虚拟地址连接。例如,如果您要执行二进制文件,将创建一个新的虚拟地址空间,并且将分配一些页面来存储二进制代码和数据(堆,堆栈...)。所以高端内存的关键属性是服务于动态内存分配请求,你永远不会预先知道用户空间会触发什么......