Linux 内核中启用的 CPU 新功能



如果 CPU 有一些新功能,Linux 内核如何处理?据我所知,PAE 不需要重建整个系统,Linux 似乎只是安装驱动程序就可以正常工作。

比如说,如果 CPU 提供了更多的执行模式,我们是否需要重建整个系统?

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

Linux 内核

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

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

显然,即使没有ISA指定的接口,Linux也可以扩展以支持使用模块来提供类似的抽象。由于 Linux 是开源的,因此提供此类接口的动力较小,尽管拥有具有多个系统专用化的单个系统映像可能会有一些优势。原则上,动态内核修补可以提供更广泛的扩展,尽管它主要用于关键(面向安全性/可靠性)更新。通常,如果一个人正在更换硬件,一个人将重新启动并可以更新软件。

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

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

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

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

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

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

最新更新