Linux 内核可以在不重新构建内核的情况下支持的新功能类型取决于指令集和功能的性质。由于 x86 提供了一种直接保存处理器状态(以及指示存在多少状态)的方法,因此即使是添加应用程序级状态的功能也可以用于新内核。
一些 ISA 提供的软件层可以在某种程度上独立于操作系统;例如,Alpha 有 PAL(特权架构库)。这样的层可以从操作系统中抽象出硬件(有点像 BIOS 的使用方式),允许操作系统使用该软件来执行特定于实现的操作。
显然,即使没有 ISA 指定的接口,Linux 也可以扩展为支持使用模块来提供类似的抽象。由于 Linux 是开源的,因此提供这样一个接口的动机较小,尽管 可能 拥有具有多个系统专业化的单个系统映像会有一些优势。原则上dynamic kernel patching 可以提供更广泛的扩展,尽管它主要用于关键(安全/可靠性导向)更新。一般来说,如果一个人正在改变硬件,一个人将重新启动并且可以更新软件。
为了使用这样的接口,需要在内核编译时知道可能受影响的子系统。如果从现有内核中抽象出一个新特性需要大型抽象层软件,那么只使用一个新内核通常会更有意义。如果支持新功能需要在抽象层软件和现有内核之间频繁来回调用,则性能往往会受到影响。 (Linux 在设计理念上是面向单体的——更喜欢性能而不是抽象——因此,即使增加的复杂性微乎其微,要求最终可能成为管理程序层的东西也不太可能具有吸引力。)
如果没有这样的抽象层,则无法在不更改内核的情况下添加添加状态或以其他方式需要新特权操作的更改。原则上,仅需要特权启用该模式但不添加新状态的新模式(例如,模式指示符使用内核写入为读取的保留位)和对其他应用程序是安全的启用(因为不会修改上下文切换代码)可以通过相对简单的内核模块来支持。
例如,内核模块可用于支持全新的指令编码,该编码由使用新编码的代码页的页表条目中先前保留的位指示。由于更改仅限于特定页面,因此不需要内核核心的特殊支持
因为 PAE 使用了不同的页表条目格式,所以添加支持需要新的内核。但是,只要核心内核支持 PAE,就可以通过内核模块升级非 PAE 感知子系统以支持 PAE。
新的非特权指令不添加状态或生成新类型的中断/异常(进入特权模式),不需要内核支持即可被应用软件使用。
(我什至不是程序员,更不是操作系统开发人员,所以我不知道 Linux 是否以内核模块可以添加新的异常处理代码的方式抽象异常处理。理论上,ISA 可以定义一个更大的异常处理程序表,保留未使用的条目以支持将来的异常,在这种情况下,允许模块添加新异常类型的处理可能是实用的。当然,如果核心内核允许模块更改任意中断处理程序,任何此类中断(可能包括系统调用)都可以定向到模块的代码,然后调用核心内核函数来处理未更改的方面。允许模块以这种方式劫持内核似乎是不可取的。)