OS自作入門15日目覚書
そろそろ、ペースを落さないと辛くなってきたので(笑)、今日からは毎日1章ずつ読むことにした。といいつつ、実は16日目もちょっと読んでいたりするけど。ここまでは割り込みの処理がメインだったので(でいいのかな?)IDTは使っていたけど、GDTはほとんど気にしないで進んできた。で、15日目はマルチタスク。またまたヘヴィなことを(笑)。とはいえ、デッドロックとかセマフォみたいな話は全然なくてプロセスを切り替えることだけの話になっている(こういう重要なところをあえてハズして「とにかく作って動かしてみよう!!」という川合さんの姿勢には大賛成だ)。要約すると、
1。タスクの状態(プログラムのアドレス、レジスタ)を保存するための構造体TSS32を作成。
2。その構造体のメモリ上の位置をGDTに登録。
3。far-JMP命令でGDTを指定すると、そこで指定されているTSS32構造体をもとにしてタスクが切り替わる。
4。タスクの切り替えるタイミングは12-13日目のタイマを利用(だから時間かけたのかな?)。
でいいのかなぁ。
覚書:
TSS32構造体は104バイト(p.292)なので、p.294のGDT登録 set_segment()ではリミットを103にしている。GDTのリミットってなんだ?と思ったら、p.116を見ればリミット=セグメントのバイト数-1となっているから正しいと思う。
あと、4日目p.69-70のときに説明していなかった、ESPの値についてp.305にすこし記述がある。関数がコールされると、ESPから順にリターンアドレス、引数の順にスタックされている(スタックということを考えると、引数の一番右から順にpushされて最後にリターンアドレスがpushされてそこのポインタがESPに代入されると考えたほうがいいのかな)。
1。タスクの状態(プログラムのアドレス、レジスタ)を保存するための構造体TSS32を作成。
2。その構造体のメモリ上の位置をGDTに登録。
3。far-JMP命令でGDTを指定すると、そこで指定されているTSS32構造体をもとにしてタスクが切り替わる。
4。タスクの切り替えるタイミングは12-13日目のタイマを利用(だから時間かけたのかな?)。
でいいのかなぁ。
覚書:
TSS32構造体は104バイト(p.292)なので、p.294のGDT登録 set_segment()ではリミットを103にしている。GDTのリミットってなんだ?と思ったら、p.116を見ればリミット=セグメントのバイト数-1となっているから正しいと思う。
あと、4日目p.69-70のときに説明していなかった、ESPの値についてp.305にすこし記述がある。関数がコールされると、ESPから順にリターンアドレス、引数の順にスタックされている(スタックということを考えると、引数の一番右から順にpushされて最後にリターンアドレスがpushされてそこのポインタがESPに代入されると考えたほうがいいのかな)。
この記事へのコメント