●タスクスイッチ
コンテキストスイッチでアドレス空間やカーネルスタックが変わっても
レジスタの内容は明示的に変更しない限り変更されない.
そういう意味では(当然ながら)CPUの挙動の連続性は失われない.
●カーネルスタック
プロセス(タスク)ごと1つカーネル領域に存在.
thread_infoと(デフォルト)8Kを共有する.
もちろんプロセスのスタックとは別.
●TSS
Linuxでは以下の場合にTSSを利用する.
・ユーザモード<->カーネルモードの移行の際のスタック切り替え
・I/O許可マップの参照
タスク数分のTSSは必要とせず、プロセッサに1つあればよい.
カーネルスタックはタスク数分あるのにTSSはCPU分なのはなぜ???
⇒タスクを切り替える際にTSSにそれぞれのtask_structの値を設定するから.
load_esp0関数(include/asm-i386/processor.h)
●カーネルスレッド
テキストやデータ領域すべてがカーネル領域内にあるプロセス
●メモリ空間関連
mmがNULLの場合はカーネルスレッド.
active_mmには間借りしているprevの仮想アドレス空間
一般プロセス mm(自空間)/active_mm(mmと同値)
カーネルスレッド mm(NULL)/active_mm(間借りしている一般プロセスのmm、NULLでない場合は実行中を意味する)