LinuxにおけるTSS

めも.
(2/25 一部追記)
参考: http://wiki.osdev.org/Context_Switching

Linux はTSSを利用していない(Windowsも).その理由は
・速くない
ディスクリプタテーブルの上限は8192 (但しコンテキストスイッチ時に GDTR を切り替えればこの制限は突破できる)
x86 のみ (Potable じゃない)
浮動小数レジスタなどには関与しない


ハードウェアでやっちゃった方がレジスタの切り替えが速いような気がしなくもないけど,遅い理由としては,
linuxではセグメントを利用していないけれどTSSではセグメントレジスタの待避をおこなっている
・さらにセグメントレジスタをロードするときは,GDTへのアクセスや特権レベルのチェックなどがおこなわれる
といったことがあるよう.


ただし,TSSを利用することで特権レベルが変化したときにスタックが自動で切り替わるので,一つだけTSSを利用している(というよりそもそも特権レベルを0から3へ変更するためにTSSが必要).これによって,割り込みが発生して特権レベルが0になったとき自動でスタックが切り替わる.コンテキストスイッチ時にはTSSの特権レベル0のスタックの切り替えもちゃんとおこなっている.


なお,スタックを切り替えなかった場合,


1. ユーザーモードでスタックオーバーフローが発生
2. 一般保護例外のハンドラが呼ばれる
3. ハンドラが呼ばれる過程で現在のEIPの値などをスタックにpushするが,既にスタックが一杯なので再びオーバーフロー(ダブルフォールト)
4. 3.と同じことが発生し,トリプルフォールトが発生する


といったことが起る可能性がある.トリプルフォールトが発生した場合,プロセッサは強制終了する.