jsc*_*oot 6 linux memory-management linux-kernel
在linux内核中,mem_map是包含所有"struct page"描述符的数组.这些页面包含lowmem中的128MiB内存,用于动态映射highmem.
由于lowmem大小为1GiB,因此mem_map阵列只有1GiB/4KiB = 256KiB条目.如果每个条目大小为32字节,则mem_map内存大小= 8MiB.但是如果我们可以使用mem_map映射所有4GiB物理内存(如果我们在x86-32上有这么多物理内存可用),那么mem_map数组将占用32MiB,这不是很多内核内存(或者我错了?).
所以我的问题是:为什么我们首先需要将低128MiB用于间接高精度映射?换句话说,为什么不直接在内核空间中映射所有那些最大4GiB物理内存(如果可用)?
注意:如果我对上面的内核源代码的理解有误,请更正.谢谢!
看这里: http: //www.xml.com/ldd/chapter/book/ch13.html
内核低内存是“真正的”内存映射,在 x86 上使用 32 位指针寻址。
内核高端内存是“虚拟”内存映射,在 x86 上通过虚拟结构进行寻址。
您不想将其全部映射到内核地址空间,因为您无法始终对所有地址进行寻址,并且您需要将大部分内存用于虚拟内存段(虚拟的页面映射进程空间)。
至少,我就是这么读的。哇,你问的问题太复杂了。
为了引起更多混乱,第 13 章讨论了一些 PCI 设备无法寻址 32 位空间,这就是我之前评论的起源:
在 x86 上,由于 DMA,某些内核内存使用仅限于第一千兆字节内存解决关切。我不是 100% 熟悉这个主题,但 PCI 总线上有 DMA 的兼容模式。这可能就是你正在看的。