我读了以下声明:
x86架构包括一个 特定的段类型称为Task 状态段(TSS),用于存储硬件 上下文。虽然Linux不使用 硬件上下文切换,它是 尽管如此,却被迫建立了TSS 系统中每个不同的CPU。
我想知道:
最后一如既往,感谢您的耐心和回复。
----------- --------------加
http://wiki.osdev.org/Context_Switching得到了一些解释。
像我这样迷茫的人可以看看它。 8 ^)
答案 0 :(得分:41)
x86 TSS对于硬件多任务处理非常慢,与软件任务切换相比几乎没有任何好处。 (事实上,我认为这样做很多次都是手动击败TSS)
TSS也因使用起来而烦人且繁琐,即使是x86-64也不易携带。 Linux旨在开发多种体系结构,因此它们可能选择使用软件任务切换,因为它可以以独立于机器的方式编写。此外,软件任务切换比可以完成的工作提供了更多的功能,并且通常比TSS更容易设置。
我相信Windows 3.1使用了TSS,但至少NT> 5内核没有。我不知道任何使用TSS的类Unix操作系统。
请注意TSS 是强制性的。操作系统所做的事情是创建一个TSS条目(每个处理器),每次需要切换任务时,他们只需更改此单个TSS。此外,软件任务切换在TSS中使用的唯一字段是ESP0
和SS0
。这用于从中断环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非常注重效率,你可以打赌有人已经分析了每一个可能的选项,并且目前使用的选项是最好的妥协。