为什么Linux不通过TSS使用硬件上下文切换?

时间:2010-04-26 03:46:33

标签: linux x86 linux-kernel low-level

我读了以下声明:

  

x86架构包括一个   特定的段类型称为Task   状态段(TSS),用于存储硬件   上下文。虽然Linux不使用   硬件上下文切换,它是   尽管如此,却被迫建立了TSS   系统中每个不同的CPU。

我想知道:

  • 为什么Linux不使用硬件支持进行上下文切换?
  • 硬件方法不是比软件方法快得多吗?
  • 是否有任何操作系统可以利用硬件上下文切换? Windows是否使用它?

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

----------- --------------加

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

像我这样迷茫的人可以看看它。 8 ^)

3 个答案:

答案 0 :(得分:41)

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

TSS也因使用起来而烦人且繁琐,即使是x86-64也不易携带。 Linux旨在开发多种体系结构,因此它们可能选择使用软件任务切换,因为它可以以独立于机器的方式编写。此外,软件任务切换比可以完成的工作提供了更多的功能,并且通常比TSS更容易设置。

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

请注意TSS 是强制性的。操作系统所做的事情是创建一个TSS条目(每个处理器),每次需要切换任务时,他们只需更改此单个TSS。此外,软件任务切换在TSS中使用的唯一字段是ESP0SS0。这用于从中断环3代码中获取0。没有TSS,就没有已知的Ring 0堆栈,这当然会导致GPF并最终导致三重故障。

答案 1 :(得分:17)

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

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

答案 2 :(得分:6)

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

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

Linux非常注重效率,你可以打赌有人已经分析了每一个可能的选项,并且目前使用的选项是最好的妥协。