コンテキストスイッチ
コンテキストスイッチを行うswitch_to()(CPU依存部分)の処理。
switch_to(prev,next,last) - プロセスの切替えを行う
pushflでeflagをスタックに退避
prev->thread.espにesp退避
next->thread.espをespに復旧
(スタックが切り替わり、currentも切り替わったことになる)
1:のアドレスをprev->thread.eipに保存
(復旧時は1:から動作再開することになる)
next->thread.eipをpushしておく。
(__switch_toからの戻り時にこの値がリターンアドレスとして使用される)
__switch_to() (callではなくjmpで飛ぶ) - TSSの設定を行う
:
next->thread.espをTSSに保存
(ユーザモード->カーネルモード等の特権レベル変更時
スタックポインタはTSSから取得されるので設定が必要)
:
1:
popflでeflagを復旧