41

我阅读了以下声明:

x86 架构包括一种称为任务状态段 (TSS) 的特定段类型,用于存储硬件上下文。尽管 Linux 不使用硬件上下文切换,但它仍然被迫为系统中的每个不同 CPU 设置一个 TSS。

我想知道:

  • 为什么 Linux 不使用硬件支持来进行上下文切换?
  • 硬件方法不是比软件方法快得多吗?
  • 有没有利用硬件上下文切换的操作系统?窗户使用它吗?

最后,一如既往,感谢您的耐心和回复。

- - - - - -添加 - - - - - - -

http://wiki.osdev.org/Context_Switching得到了一些解释。

像我这样困惑的人可以看看它。8^)

4

3 回答 3

43

x86 TSS 对于硬件多任务处理非常慢,与软件任务切换相比几乎没有任何好处。(事实上​​,我认为手动操作会击败 TSS 很多次)

TSS 也以使用起来烦人且乏味而著称,而且它不可移植,即使对于 x86-64 也是如此。Linux 旨在处理多种架构,因此他们可能选择使用软件任务切换,因为它可以以独立于机器的方式编写。此外,软件任务切换提供了比 TSS 更强大的功能,并且通常比 TSS 更容易设置。

我相信 Windows 3.1 使用了 TSS,但至少 NT >5 内核没有。我不知道任何使用 TSS 的类 Unix 操作系统。

Do note that the TSS is mandatory. The thing that OSs do though is create a single TSS entry(per processor) and everytime they need to switch tasks, they just change out this single TSS. And also the only fields used in the TSS by software task switching is ESP0 and SS0. This is used to get to ring 0 from ring 3 code for interrupts. Without a TSS, there would be no known Ring 0 stack which would of course lead to a GPF and eventually triple fault.

于 2010-05-03T21:42:34.613 回答
17

Linux 在 1.3 之前的时间框架 iirc 中曾经使用基于硬件的切换。我相信基于 sw 的上下文切换结果更快,而且更灵活。

另一个原因可能是最小化特定于架构的代码。Linux 到非 x86 架构的第一个端口是 Alpha。Alpha 没有 TSS,因此如果所有拱门都使用 SW 切换,则可以共享更多代码。(只是一个猜测。)不幸的是,1.2-1.3 内核时期的内核更新日志没有得到很好的保存,所以我不能更具体。

于 2010-05-03T21:34:50.303 回答
7

Linux 不使用分段内存模型,因此不使用此分段特定功能。

x86 CPU 对上下文切换有许多不同类型的硬件支持,因此区别不在于硬件与软件,而在于操作系统如何使用各种可用的硬件功能。没有必要全部使用它们。

Linux 如此注重效率,您可以打赌有人已经分析了所有可能的选项,并且当前使用的选项是最好的折衷方案。

于 2010-04-26T04:06:34.480 回答