コンテキストスイッチの実装

マイコン(SH7125)で簡単なOSを実装中。
とりあえず、今のところの頭の中身を整理しておく。

○スタック周り
・スタック領域は、タスク用のスタック領域(タスク数分)と非タスク用(割り込みなど)のスタック領域をそれぞれ確保する。
・各タスク用のスタック領域は、スタックポインタをTCBの中に入れておいて、必要なときに切替える。
・割り込み発生時は、先に汎用レジスタを待避して、割り込みの処理に入る前に非タスク用のスタック領域へ切替える。
・スタック領域は、あらかじめCall Walkerなどを使って最大スタックサイズを求めておいて、タスク生成時に直接指定する。

・カーネルの処理を実行しているときは、非タスク用のスタック領域で問題ない確認。
・スタック領域を保護するための仕組みがあれば良い。

○コンテキストスイッチ周り
・コンテキストスイッチが発生するのは、主に3つ。カーネルの起動、終了時(1)。
 タスク中でタスクの動作に関係するシステムコールを呼び出した場合(2)。
 割り込み中にタスクの動作に関係するシステムコールを呼び出した場合(3)
・2:関数呼び出しをしてカーネルに入ってきているので、caller-saveなレジスタと制御レジスタを保存する。そして切替える。
・3:割り込み前の関数での全てのレジスタの情報を保存する。割り込みが全て完了した段階で切替える。

頭の中で整理できているのはこんなところかな。
もう少し実装を練ってみて、明日あたりには実際に実装してみよう。

Posted at : 2009-09-02 01:36:40 / Category : none

Comments

まだコメントはありません / No comment.

Send comment


Name


Mail-address (empty is OK. If you want to notify update, please fill mail-address.)


Bot check code (241222 と入力してください / Please input 241222.)