CPU Linux 内核中启用的新功能

CPU new features enabled in Linux kernel

如果 CPU 有一些新特性,Linux 内核是如何处理的? 根据我的记忆,PAE 不需要重建整个系统,Linux 似乎只需要安装驱动程序就可以了。

话说,如果CPU提供了更多的执行方式,是不是需要重建整个系统?

如果是这样,为什么 PAE 不需要重建而这个可能需要重建?

Linux 内核在不重建内核的情况下可以支持的新功能类型取决于指令集和功能的性质。由于 x86 提供了一种直接保存处理器状态的方法(以及指示存在多少状态),因此即使是添加应用程序级状态的功能也可以与新内核一起使用。

一些 ISA 提供了一个可以在某种程度上独立于操作系统的软件层;例如,Alpha 拥有 PAL(特权架构库)。这样的层可以从操作系统中抽象出硬件(有点像 BIOS 的使用方式),允许操作系统使用这个软件来执行特定于实现的操作。

显然,即使没有 ISA 指定的接口,Linux 也可以扩展以支持使用模块来提供类似的抽象。由于 Linux 是开源的,因此提供此类接口的动机较少,尽管 可能 拥有具有多个系统专业化的单个系统映像有一些优势。原则上 dynamic kernel patching 可以提供更广泛的扩展,尽管它主要用于关键 (security/reliability-oriented) 更新。一般情况下,如果是换硬件,那就是重启,可以更新软件。

为了使用这样的接口,在内核编译时需要知道可能受影响的子系统。如果从现有内核中提取新功能需要大型抽象层软件,那么仅使用新内核通常更有意义。如果支持新功能需要在抽象层软件和现有内核之间频繁来回调用,那么性能往往会受到影响。 (Linux 在设计理念上是面向整体的——更喜欢性能而不是抽象——所以即使增加的复杂性微不足道,要求最终成为管理程序层的东西也不太可能有吸引力。)

如果没有这样的抽象层,则在不更改内核的情况下无法添加添加状态或以其他方式需要新特权操作的更改。原则上,只需要特权启用模式但不添加新状态的新模式(例如,模式指示器使用内核写入为读取的保留位)是安全的对于已启用的其他应用程序(因为不会修改上下文切换代码)可以通过相对简单的内核模块来支持。

例如,内核模块可用于支持全新的指令编码,该编码在使用新编码的代码页 table 条目中的先前保留位指示。由于更改仅限于特定页面,因此不需要内核核心的特殊支持

因为 PAE 使用不同的页面 table 条目格式,添加支持需要新内核。但是,只要核心内核支持 PAE,就可以通过内核模块升级非 PAE 感知子系统以支持 PAE。

不添加状态或生成新类型 interrupts/exceptions(即进入特权模式)的新非特权指令,不需要内核支持即可由应用程序软件使用。

(我什至不是程序员,更不用说操作系统开发人员了,所以我不知道 Linux 是否以内核模块可以添加新的异常处理代码的方式抽象异常处理。理论上,一个ISA可以定义一个更大的异常处理程序table,保留未使用的条目以支持未来的异常,在这种情况下,允许模块添加对新异常类型的处理可能是可行的。当然,如果核心内核允许模块更改任意中断处理程序,任何此类中断(可能包括系统调用)都可以定向到模块的代码,然后调用核心内核函数来处理未更改的方面。允许模块以这种方式劫持内核似乎是不可取的.)