diff -u:内核开发的新内容
在具有许多 CPU 的系统上,启动时间可能会变得缓慢,部分原因是启动所有内存芯片需要时间。Mel Gorman 最近提交了一些补丁,以并行而不是一个接一个地启动内存芯片。尝试实现此类功能的主要问题之一,也是此类补丁以前未进入内核的主要原因之一,是需要避免减慢小型系统的速度。
Mel 的补丁修改了 kswapd 代码,为每个 CPU 提供其自己的 RAM 初始化线程。在较小的系统上,理论上这将完全没有变化,而较大的系统可能会看到启动时间显着缩短。
Waiman Long 的一项初步测试报告称,在他的 12 TB 系统上,启动时间缩短了 25%,从 404 秒缩短到 298 秒。当 Peter Zijlstra 和 Mel 询问这是否对他来说有值得的改变时,Waiman 回复说
启动速度快 100 秒当然是一件好事。目前,固件 POST 部分的启动过程比操作系统启动花费的时间更多。因此,我想说这个补丁目前并不是非常关键,因为具有如此大内存的机器相对较少。但是,如果我们展望不久的将来,一些新的内存技术(如持久内存)即将出现,并且具有大量内存(无论是否持久)的机器将变得更加普遍。如果我们展望未来,这个补丁肯定会很有用。
Scott J. Norton 也补充说:“100 秒确实很重要,而且意义重大。当企业的一台大型机器发生故障时,他们的业务就会停止(除非他们有快速故障转移解决方案到位)。机器停机的每一分钟和每一秒对于这些企业来说都至关重要。”
Andrew Morton 稍微推动 Mel 简化他的代码,但 Mel 认为 Andrew 的建议可能会使情况变得更糟,例如迫使内核依赖用户空间代码。只要系统不断变大,像这样的补丁似乎注定最终会被接受。
英特尔已邀请 Linux 内核工程师协助开发如此新的芯片,以至于他们的内部开发人员必须在最终硬件的软件模拟上进行编码。
Dave Hansen 发布的补丁不适用于英特尔以外的任何人——因为没有人拥有这些芯片——但他希望获得关于他们为用户空间实施内存保护密钥的反馈。
其基本思想是利用现有寄存器中以前未使用的位,并引入新的寄存器和相关的汇编器指令,以在逐页的基础上保护系统内存。从本质上讲,这使用户能够在一组给定的页面上启用一组特定的操作,同时禁止其他操作。
当 Ingo Molnar 要求 Dave 列出此芯片功能的一些潜在用例时,Dave 回复说,用户可能希望保护各种东西,例如以下内容:“数据结构,如日志或仅在非常有限的代码路径中写入的日志,但您希望保护它们免受‘杂散’写入。”或者:“数据库,其中查询操作永远不需要写入内存,但插入则需要。您可以保持数据在整个操作期间为只读,除非实际进行插入。”
而且,Alan Cox 也建议
您还可以将其用于某些类型的模拟器技巧,我怀疑甚至可以用于解释器和控制对“受污染”值的访问。
其他明显的用途是使其更难让 SSL 或 ssh 类型错误泄漏密钥数据,方法是减少越界访问造成的损害。
Ingo 询问在某些 CPU 上存在此功能而在其他 CPU 上不存在是否会存在任何问题。Dave 回复说:“新 CPU 功能总是存在问题。”然后他继续说道
我一直在考虑尝试使用旧的 mprotect() 在较旧的 CPU 上“模拟”该功能,以便我们可以拥有一个人们今天可以使用的 API,但在未来的 CPU 上会神奇地变得快速。但是,问题在于线程本地方面。
mprotect() 从根本上来说是进程范围的,而保护密钥从根本上来说是线程本地的。除非我们做一些稍微极端的事情,例如拥有每个线程的页表,否则这些事情将很难调和。
讨论变得技术性很强,但显然主要问题是如何支持新的芯片功能,而不是是否支持它们。
Luis R. Rodriguez 扩展了模块签名以支持固件签名。最终,他认为应该也可以对用户数据进行签名。这似乎是现有功能的自然扩展,并且没有太大争议。但是,固件签名代码和模块签名代码之间存在某些差异;例如,Luis 的代码引入了单独的文件来包含固件签名,以此来更好地处理许可问题。
Luis 的补丁也“由于对 firmware_class API 的限制,在宽松的 [固件] 签名模式下不会污染内核;但是,预计未来会扩展以启用此功能。”