OS作成
TSSを使わないタスクスイッチを実装
Intel CPUが持っているタスクスイッチ機能を使わずにスイッチ部分を実装。TSSのスイッチ時に大分悩んだので結構すんなり出来たかな。
今回定義した各タスクの状態は
// Light TSS typedef struct _LTSS { u_int32_t eip; u_int32_t esp; u_int32_t cr3; } LTSS;
この12バイトだけ。TSSの104バイトに比べると大分軽くなっている。
ではこれだけで本当にタスクの状態を表せているのか?というと大体の所は表せている。
というのもタスクをスイッチする時に発生する割り込みハンドラは
.global asm_process_switch .align 4, 0x90 asm_process_switch: push %ds push %es pusha movw $0x10, %ax movw %ax, %ds movw %ax, %es call i20h_process_switch popa pop %es pop %ds iret
のように定義しているんだけど、ここで「push %ds」「push %es」「pusha」をしていることにより
ds, es, eax, ebx, ecx, edx, esp, ebp, esi, edi
が保存されている。またCPUは割り込み時に
cs, eflags, eip
をスタック上に保存しているのでcsとeflagsについても割り込み終了のiret時に復帰してくれる。
eipとespだけはswitch直後に値を復帰したいので特別にLTSSに保存させておく。
後はss0,esp0は今後特権レベルをカーネルランドとユーザランドを分けるときに考えて、iobaseもio portへの権限を付けるときに考える。またFPUとかも必要かな。
こうして考えてみるとTSSスイッチがいかに無駄な処理をしているかが良くわかった。
というわけで今回の分をcommit
Sodex rev.8
次の目標はスケジューリングだけど、これはとりあえずpictimer割り込み毎にタスクを切り替えるだけでいいかな。Linux, minix等のスケジューリングを軽く読んでおこう。
というわけで次は何やろ、ファイルシステムを考えてみよっかな。