加入收藏 | 设为首页 | 会员中心 | 我要投稿 十堰站长网 (https://www.0719zz.com/)- 混合云存储、网络、视频终端、云计算、媒体处理!
当前位置: 首页 > 综合聚焦 > Linux > 正文

linux – 为什么我们在x86上需要zone_highmem?

发布时间:2021-03-31 03:13:04 所属栏目:Linux 来源:互联网
导读:在linux内核中,mem_map是包含所有“struct page”描述符的数组.这些页面包含lowmem中的128MiB内存,用于动态映射highmem.由于lowmem大小为1GiB,因此mem_map数组只有1GiB / 4KiB = 256KiB条目.如果每个条目大小为32字节,则mem_map内存大小= 8MiB.但是如果我们可

在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章讨论了一些无法解决32位空间的PCI设备,这是我之前评论的起源:

在x86上,由于DMA寻址问题,一些内核内存使用仅限于第一千兆字节的内存.我不是100%熟悉这个主题,但PCI总线上有DMA的共处模式.这可能就是你在看的东西.

(编辑:十堰站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读