ウォンツテック

そでやまのーと

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等のスケジューリングを軽く読んでおこう。

というわけで次は何やろ、ファイルシステムを考えてみよっかな。