「30日でできる!OS自作入門」をRustで。15日目

Posted on July 4, 2019 , Tags: OS自作入門, OS, Rust

「30日でできる!OS自作入門 」のC言語の部分をできるだけRustですすめてみる。今回は15日目の内容。

タスクのスイッチをする

マルチタスクを目指して、まずは2つのタスクの切り替えを目指す。
そのために、まずはタスクの状態保持用のTSSを定義する。

このTSSを使って、二つのタスクを定義していく。

また、10秒たったらタスクスイッチするように設定する。

boot_b_main は5秒経過で元のタスクに戻るように定義する。

fifoについてはlazy_staticでグローバルに定義していたが、それぞれのタスクごとに生成するような方式に変えた。
最後にアセンブリ言語まわりの実装を追加する。

JMP する時は何となくおかしくなりそうな気がするので naked にしている。

実行結果

以下の通り、10sec表示で一旦カーソルの点滅がとまり、5秒後に再度復活したことがわかる。

2タスクのスイッチ

write_with_bgマクロの改良

write_with_bgマクロにsheetのindexとデータを保持するbufのアドレス両方わたしていたが、bufのアドレスはsheet自体が持っているため、わざわざ渡さなくてもよいことに気づいた。

これで引数が一個減って少し楽になった。

タスクを高速に切り替える

マルチタスクを実現するためには意識しないくらい高速にタスクを切り替える必要がある。
0.02秒ごとに切り替わるようにする。
ちゃんと動いていることを検証するため、ちょっと汚いが、static mut経由でsheetの情報を渡しつつ、task_b_mainでも画面に表示ができるようにする。

farjmp は前述のswitchtaskを少し書き換えたものとなる。
task_b_main は以下のようになる。

実行結果

実行してみると、以下のとおり、メインのharibote_osの表示もtask_b_mainの表示もされたことがわかる。
また、カーソルの点滅も見たところ特に違和感なく点滅していた。

タスクの高速スイッチ結果

暗黙的にタスクのスイッチをする。

これまではharibote_os()task_b_main()で明示的に切り替えを行っていたが、暗黙的にタスクのスイッチができるようにする。 tss.rsmt.rsに名前を変え、こちらに暗黙的な切り替え用の処理を書いていく。

timer.rsのinthandler20にタスクスイッチ用の分岐をいれる。

本の通り、このinthandler20の中でタスクスイッチができるといいのだが、うまく動かず、asm.rsの呼出側で調整するようにした。
この辺り原因がわからないので、そのうち調査したい。

これで、lib.rs上のタスクスイッチ関係のコードを削除しても動くようになった。
画面上は上の結果と変わらないので省く。

15日目は以上となる。ここまでの内容のコードはyoshitsugu/hariboteos_in_rustのday15としてタグを打ってある。