自作OSでのプロセス実装について (2) ~初めてのユーザプロセス~
この投稿は Aizu Advent Calendar 2014 の 7 日目の記事です。 前の人 @masaponto 次の人 @MiZuKi_Sonoko また、 自作OS Advent Calendar 2014 の 7日目の記事でもあります。 自作OSでのプロセス実装について (1) ~初めてのユーザプロセス~ の続きです。 前回の内容 プロセスとは? x86リングプロテクション(ユーザモードとカーネルモード) マルチタスク 割り込み コンテキストスイッチ を一気に説明しました。 正直、多少知識が無いとわからないよなあって感じになっているのでその点は反省しております。 今回は コンテキストスイッチの実装 ユーザプロセス起動 を見て行きたいと思います。 前回はタイマ割り込みによってコンテキストスイッチが起きる、というところで終わったと思います。 そこの流れが大事ですので再掲します。 タイマ割り込み発生 ↓ 実行中プロセスは割り込まれる (中断される) ↓ カーネルモード突入 ↓ 今のカーネルモードスタックへ 今の実行コンテキストを保存 (CPUのレジスタとか) ↓ 次のプロセスを選ぶ ↓ 次のカーネルモードスタックから 次の実行コンテキスト復元 ↓ ユーザモードに復帰 はい、こんな感じです。 (※カーネルスタックではわかりづらいので カーネルモードスタック に変更します。) では、早速ですがもぷりんOSのコンテキストスイッチ実装を見て行きましょう。 この部分は主にLinuxの実装を真似ています。 と言っても、x86上で同じことをやろうとしたら大体こうなると思います。。。 リポジトリはこちら mopp/Axel 上記の流れに沿ってコードを掲載していきます。 まずは、一番はじめに呼ばれる割り込みコードを見てみましょう。 以下のこれは、割り込みエントリ関数で、タイマー割り込み以外のキーボード割り込みや一般保護例外などでも呼ばれる部分です。 上記コードは src/interrupt_asm.asm にあります。 ただし、Gistに貼った方は見やすさのためにマクロなど全て展開済みです。