内核高内存淘汰时间表
关注了就能看到更多这么棒的文章哦~
作者: Jonathan Corbet
2025年12月23日
Gemini 辅助翻译
https://lwn.net/Articles/1051010/
Linux Plumbers Conference (LPC)
Arnd Bergmann 在他的 2025 年 Linux Plumbers Conference 关于 Linux 内核中 32 位支持未来发展的会议上表示,这次会议是他 9 月份就同一主题所做演讲 的后续。然而,这次的重点是内核的“高内存”(high memory)抽象,以及何时可以将其移除。尽管对于某些功能,包括在这些系统上支持大量内存的功能,可能会更快地移除,但内核社区似乎还需要在一段时间内继续支持 32 位系统。
高内存问题
他首先指出,高内存(high memory)是为了支持安装了超过 768MB 物理内存的 32 位系统,并在默认内核配置下启用;它最多可支持 16GB 的物理内存。然而,高内存抽象是一个维护负担,并且“需要被淘汰”。感兴趣的读者可以在 这篇文章 中了解更多关于高内存、为何需要它以及其工作原理的信息。

一个 32 位系统拥有 4GB 的虚拟地址空间(物理地址空间更大),它在用户空间和内核空间之间进行划分。有各种内核配置选项可以改变这种划分方式;最常见的配置是 VMSPLIT_3G,它将地址空间的底部 3GB 分配给用户空间,同时为内核保留 1GB。问题在于,内核的“线性映射”(linear map)(或“直接映射”,direct map),它映射了所有物理内存,必须能够容纳在内核的地址空间部分中;对于 VMSPLIT_3G,这将内核直接映射的物理内存限制在 768MB。超出此范围的任何内存都作为高内存进行管理,它必须在每次使用前显式映射(并在使用后解除映射)。
虽然存在增加内核空间大小从而增加线性映射大小的配置选项,但它们以减少应用程序可用地址空间为代价。例如,VMSPLIT_2G 选项在不使用高内存的情况下支持高达近 2GB 的物理内存,但将虚拟地址空间限制为 2GB。
Bergmann 说,有很多理由希望摆脱高内存。嵌入式开发人员不喜欢它,因为它在更新时往往是回归的来源,并使代码复杂化。虽然 32 位 CPU 仍用于嵌入式应用程序,但它们通常不安装大量内存,因此高内存在那方面并不是特别有用。内存管理维护人员出于同样的原因不喜欢高内存;他们也希望在高内存消失之前,没有人会开始认为 64 位高内存(64-bit high memory)可能是一个好主意。
当然,也有理由保留高内存。移除它会增加暴露驱动程序 bug 的可能性,并可能强制更改用户空间(user-space)代码。任何安装了超过 2GB 内存的 32 位系统,如果没有高内存抽象,实际上无法使用这些内存。即使是较小量的内存,如果不支持,也会如上所述,通过减小用户空间地址空间的大小来实现,这会破坏使用大量虚拟内存的应用程序。如果从内核中移除高内存,那么支持超过 4GB 内存的 32 位系统将毫无希望;即使是 2GB 系统也会遭受显著限制。相反,对于安装了不足 1GB 内存的系统,则完全没有影响。
目前仍在生产 32 位系统,但几乎所有这些系统的安装内存都在 1GB 或更少。他说,在新系统中使用 32 位 CPU 的唯一原因是极度的成本敏感性,因此不太可能有预算用于更大的内存量。因此,任何超过 1GB 的系统几乎肯定是旧系统。1GB 系统相对容易支持,只是其中一些具有非连续内存(discontiguous memory),这使得它们无法映射到内核的线性映射中。有变通方法,但其中一些可能需要更改用户空间。
他说,2GB 的情况越来越少见,但人们仍然拥有这些系统,因此对它们的支持可能需要像对 1GB 系统一样长时间维护。2GB VMSPLIT 选项可能对某些人有效,但它会导致 1.75GB 的虚拟地址空间,这对于运行 Firefox 来说太小了。David Hildenbrand 问“支持”是否意味着新内核必须在这些系统上工作;答案是“是的”,至少对于用户仍希望能够更新的系统而言。
此外,还有超过 2GB 内存的系统。这可能是旧的 (2007 年以前的) x86 笔记本电脑或 2012 年或 2013 年的 Arm Chromebook。显然,机载娱乐系统、火警系统和数字标牌也属于此类。他说,这些系统的电路板成本只占总成本的一小部分,所以制造商会安装更多内存。Jason Gunthorpe 问人们是否真的会将这些系统升级到当前内核;Bergmann 说他们确实会,Gunthorpe 回应说他听到这个消息很震惊。
有许多已知的 32 位系统内存超过 4GB;Bergmann 说它们都是“死系统”。其中包括 Amazon Annapurna Alpine 盒子、Calxeda Midway 系统、HiSilicon HiP04 系统等。显然,还有一些 SPARC 系统内存高达 2GB,仍在获得更新。
提议
那么,高内存问题该如何解决呢?Bergmann 表示,他曾对 VMSPLIT_4G 选项抱有很大希望,该选项将内核和用户空间完全分离,为两者各提供完整的 4GB。这将允许在不使用高内存的情况下支持高达近 4GB 物理内存的系统,并解决许多问题,但此选项从未被推到实际可用的程度,现在也没有人为此工作提供资金。因此,他说,此选项可能永远不会实现,但它也可能不会是必需的。
可能需要的是一个名为“densemem”的选项,它使用一些映射技巧来弥补物理地址空间中的漏洞。无论如何,densemem 都需要 取代 SPARSEMEM 模型,并且它可以在不使用高内存的情况下支持高达 2GB 的系统。然而,此选项会减少用户空间可用的地址空间。它也尚未工作;Bergmann 正在寻找希望帮助完成它的开发人员。
另一个可能发生的事情是“精简功能高内存”(reduced-feature high memory),即高内存支持将一次从一个子系统(subsystem)中移除。这将降低系统的复杂性,并且还将减少最终移除高内存的影响。因此,例如,对页表(page tables)、DMA 缓冲区(DMA buffers)、文件系统元数据(filesystem metadata)等在高内存中的支持可能会被移除。其他用户,例如文件支持的内存映射(file-backed memory mappings)和匿名内存映射(anonymous memory mappings),目前仍需要继续使用高内存。
多年前,低内存(low memory)是一种相对稀缺的资源,因此建议开发人员尽可能提供 __GFP_HIGHMEM 标志(表明请求可以从高内存满足)。Bergmann 建议改变这一策略,以便内存分配仅在真正需要高内存时才包含 __GFP_HIGHMEM。他说,也许可以开始逐步淘汰 32 位桌面使用场景,尽管他承认此举可能存在争议。Gunthorpe 希望确认是否不再生产此类桌面电脑;Bergmann 说确实如此。32 位桌面系统的用户是爱好者和积极寻找旧硬件的人。Dave Hansen 将这些用户描述为“一小部分有发言权的人”,并建议他们最好支持一个计算机历史博物馆。
Bergmann 说,最终,高内存可以放在 CONFIG_EXPERT 配置选项后面,使其对许多用户不可用。
Hildenbrand 询问所提出的部分移除对维护的影响;Bergmann 表示影响很小,但这将有助于后续的移除阶段。Gunthorpe 担心暴露驱动程序 bug 的可能性,以及从驱动程序中移除高内存支持可能不值得麻烦。他建议针对高内存造成大量复杂性的领域。Matthew Wilcox 说移除可能会破坏必须映射大型 folios 的内核代码;Bergmann 建议使大型 folio 支持与高内存不兼容。Hansen 说 __GFP_HIGHMEM 标志可以简单地从大型 folio 分配中移除,但 Bergmann 说那会破坏页缓存(page cache)。Gunthorpe 说,当高内存支持被移除时,需要它来缓存页的系统将无法再工作。
Bergmann 继续说道,建议可以为每个高内存用户创建一个单独的配置选项。这将允许创建每个用法的统计数据。他说,页缓存的高内存支持至少需要保留五年以上。
时间表
他总结了 32 位支持的未来时间表;看起来如下:
高内存功能集缩减将于 2026 年开始。
同样在 2026 年,VMSPLIT_2G_OPT 配置将成为 Arm、PowerPC 和 x86 系统的默认配置。
2027 年,高内存支持可能会完全从 Arc、Microblaze、MIPS、SPARC 和 xtensa 等较少使用的架构中移除。
顺利的话,2027 年也将看到 Armv7 系统增加 densemem 支持。
203x 年,高内存中的页缓存支持将消失。
204x 年,对最后几个 32 位架构的支持将被移除。
Hansen 回应说,许多移除可以更快地完成。他还建议了一个配置选项,只使用低内存(low memory),即使在支持高内存的系统上,直到内存不足(out-of-memory)情况迫使也使用高内存。Will Deacon 说,VMSPLIT_4G 可能仍有希望,随着高内存支持的移除,它可能会变得更具吸引力。他问如果有人完成这项工作是否有用;Bergmann 回答说会有用,但这项工作是否会完成尚不清楚。
会议结束后,Bergmann 发布了 一系列补丁,实现了他 2026 年时间表中的部分项目。
本次演讲的 幻灯片 和 视频 可供查阅。
[感谢 Linux 基金会,LWN 的差旅赞助商,支持我参加此次活动。]
全文完LWN 文章遵循 CC BY-SA 4.0 许可协议。
欢迎分享、转载及基于现有协议再创作~
长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~
1753

被折叠的 条评论
为什么被折叠?



