gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:59:27 26 4
gpt4 key购买 nike

在 linux 内核中,mem_map 是一个包含所有“struct page”描述符的数组。这些页面包括 lowmem 中用于动态映射 highmem 的 128MiB 内存。

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

所以我的问题是:为什么我们首先需要使用 low 中的 128MiB 进行间接 highmem 映射?或者换句话说,为什么不将所有最大 4GiB 物理内存(如果可用)直接映射到内核空间?

注意:如果我对上面内核源码的理解有误,还请指正。谢谢!

最佳答案

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

内核低内存是“真正的”内存映射,在 x86 上用 32 位指针寻址。

内核高端内存是“虚拟”内存映射,在 x86 上用虚拟结构寻址。

你不想把它全部映射到内核地址空间,因为你不能总是寻址所有的,而且你需要大部分内存用于虚拟内存段(虚拟的,页面映射的进程空间。)

至少,我是这样读的。哇,你问的这个问题好复杂。

更令人困惑的是,第 13 章讨论了一些 PCI 设备无法寻址 32 位空间,这是我之前评论的起源:

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

关于linux - 为什么我们需要 x86 上的 zone_highmem?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/576761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com