为什么';Linux是否通过TSS使用硬件上下文开关?

为什么';Linux是否通过TSS使用硬件上下文开关?,linux,x86,linux-kernel,low-level,Linux,X86,Linux Kernel,Low Level,我宣读了以下声明: x86体系结构包括 称为任务的特定段类型 状态段(TSS),用于存储硬件 上下文。虽然Linux不使用 硬件上下文切换,它是 尽管如此,我们还是被迫为 系统中每个不同的CPU 我想知道: 为什么Linux不使用对上下文切换的硬件支持 硬件方法不是比软件方法快很多吗 有没有利用硬件上下文切换的操作系统?windows使用它吗 最后,一如既往,感谢您的耐心和回复 -----------增加-------------- 我得到一些解释 像我这样困惑的人可以看一看。8^)Linu

我宣读了以下声明:

x86体系结构包括 称为任务的特定段类型 状态段(TSS),用于存储硬件 上下文。虽然Linux不使用 硬件上下文切换,它是 尽管如此,我们还是被迫为 系统中每个不同的CPU

我想知道:

  • 为什么Linux不使用对上下文切换的硬件支持
  • 硬件方法不是比软件方法快很多吗
  • 有没有利用硬件上下文切换的操作系统?windows使用它吗
最后,一如既往,感谢您的耐心和回复

-----------增加--------------

我得到一些解释


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

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

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


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

Linux在1.3之前的时间框架iirc中使用基于硬件的交换。我相信基于软件的上下文切换速度更快,而且更灵活


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

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

TSS也因其烦人和乏味而闻名,而且它不可移植,甚至不能移植到x86-64。Linux的目标是在多个体系结构上工作,因此他们可能选择使用软件任务切换,因为它可以以独立于机器的方式编写。此外,软件任务切换比TSS提供了更多的功能,并且通常比TSS更易于设置

我相信Windows3.1使用了TSS,但至少NT>5内核没有。我不知道有哪个类Unix操作系统使用TSS


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

谢谢你,安德鲁。您能告诉我x86CPU为上下文切换提供了哪些其他硬件支持吗?我只听说过TSS。例如,大多数MMU功能只在多线程环境中才有意义。看起来我不是很对:CPU强制Linux在ESP寄存器中使用TSS,即使没有使用其他字段。我想这里关于软件任务切换的部分已经指出了您需要的大部分内容:基于Andrew的最后一条评论:TSS对于诸如ring3->ring0转换之类的东西是必需的,在这些转换中它会获取ESP0值。这可以防止内核在进入ring0(一种安全特性)时使用ring3堆栈。Linux在这个转换中每个CPU使用一个TSS。谢谢Andrew和Matthew。我只能用一个作为答案。你的回答也很有启发性我可以发誓我只是在读OSDev论坛,然后读这个;)@Andy-最后一个带硬件任务切换的内核是2.1.108。谢谢Earlz。我把你的答案记为答案。也要感谢其他人基于DTS的交换机提供了硬件级状态管理(读:安全性),而软件交换机则没有。80年代引入IA的TSS和特权系统都在确保进程之间的安全方面发挥了作用。因此,总而言之,“一些操作系统不使用基于硬件的任务切换,因为它们更喜欢性能和可移植性,而不是安全性。”这似乎是合法的。顺便说一句,NT使用M:N线程模型,与“其他系统”不同,硬件和软件线程之间没有1:1的关系,这不仅仅解决了“任务切换性能问题”. 并非所有系统都可以实现M:N模型(例如,由于它们将硬件线程与特定CPU和进程紧密耦合),并在尝试实现时遭受性能损失(因为这样的系统缺乏适当的硬件=>用户模式信令机制,该机制也不会捆绑原始执行线程)@我对这一说法的准确性表示怀疑。CPU会检查选择器的权限,无论何时加载。没有用于检查x86_64的选择器权限。使用TSS到底需要什么“额外安全性”?感谢Andy提供的历史信息:D