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

smw*_*dia 39 linux x86 low-level linux-kernel

我读了以下声明:

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

我想知道:

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

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

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

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

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

Ear*_*rlz 42

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并最终导致三重故障.

  • 基于TSS的交换提供硬件级状态管理(读取:安全性),而软件交换机则不提供.在80年代引入IA的TSS和特权系统在确保彼此之间的流程方面发挥了作用.总而言之,"有些操作系统不使用基于硬件的任务切换,因为他们更喜欢性能和可移植性而不是安全性." 似乎是合法的. (2认同)

And*_*ver 17

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

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


And*_*gor 6

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

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

Linux是如此注重效率,你可以打赌有人已经描述了每一个可能的选项,并且当前使用的选项是最好的妥协.