このステップでは複数の user mode プログラムを同時に実行する方法を説明します. すでに, タイマー割り込み, 仮想アドレス上で user mode プログラムを実行する方法, の2つを説明をしています. それら2つを組み合わせ, タイマー割り込み発生のタイミングでプログラムを切り替える実装を行います.
今回の実装から実行される user mode プログラムをタスクと呼ぶようにします. これまでのステップでは実行される user mode プログラムは1つだけでしたが, 今後は(同じ) user mode プログラムを複数同時に動作させることになるため, user mode プログラムのインスタンスの意味でタスクという呼び名を使います.
今回のステップではタスクは2つ存在しそれぞれタスク0(=task[0]), タスク1(=task[1]) と呼ぶことにします. どちらのプログラムも同じ ELF で, タスク0は物理アドレス 0x80100000, タスク1は物理アドレス 0x80200000 にロードされます. どちらも仮想アドレス 0x0 から始まる領域で動作します. 仮想アドレスを使用することで全く同じプログラムを複数同時に実行することが可能になります.
+--------+
| |
|task[1] |
| |
+--------+ 0x80200000 -+
| | |
|task[0] | |
| | |
+--------+ 0x80100000 -+ +--------+
| | | | |
| kernel | | | task |
| | | | |
+--------+ 0x80000000 +-> +--------+ 0x0
pa va
multiple tasks - memory layout