【问题标题】:CPU new features enabled in Linux kernelLinux 内核中启用的 CPU 新功能
【发布时间】:2015-06-20 06:27:45
【问题描述】:

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

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

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

【问题讨论】:

  • 这显然取决于特性——你在说什么样的特性?新指令?特殊执行模式?更多寄存器 --- 您将需要完全重组您的问题。你在这里问的是“如果我在我的汽车上添加一个东西,汽车是否能够使用它”,没有具体说明什么类型的东西,“使用它”是什么意思,或者汽车的世代.
  • 太好了,这实际上是我要问的。您介意回答这个问题并附上简短的解释吗?
  • 不,因为我的评论不是您问题的答案。改写你的问题,我会的。
  • 我真的没有时间写书,在这里。请提出一个准确的问题。
  • 我的假设是如果CPU提供额外的执行模式,那么系统需要重建。我对此不太确定,所以如果我错了,请告诉我。

标签: linux-kernel cpu


【解决方案1】:

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

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

显然,即使没有 ISA 指定的接口,Linux 也可以扩展为支持使用模块来提供类似的抽象。由于 Linux 是开源的,因此提供这样一个接口的动机较小,尽管 可能 拥有具有多个系统专业化的单个系统映像会有一些优势。原则上dynamic kernel patching 可以提供更广泛的扩展,尽管它主要用于关键(安全/可靠性导向)更新。一般来说,如果一个人正在改变硬件,一个人将重新启动并且可以更新软件。

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

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

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

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

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

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

【讨论】:

  • Linux 让您几乎可以将任何东西构建为一个模块。与其说“不允许一个模块执行 x 是不可取的”,不如说是“加载一个设计用来挂钩异常和系统调用的模块可能不是支持新 ISA 的最佳方式”。 Linux 不会浪费时间试图让模块很难做任何他们想做的事情来保证安全。如果你加载一个恶意模块,你就完蛋了,因为它们可以覆盖任何他们想要的内存。据我了解,还不如让模块安全可靠地设计成几乎可以做任何事情。
猜你喜欢
  • 2013-12-19
  • 1970-01-01
  • 2011-10-18
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 2015-05-05
相关资源
最近更新 更多