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

Posted on June 18, 2019 , Tags: OS自作入門, OS, Rust

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

linker scriptのバグの修正

前回の記事で、lazy_staticが使えないことに触れた。いろいろと調べた結果、kernel.ldにバグがあったことがわかった。

lazy_staticが使えない以外にも、普通にstaticを使って.dataセクションが使われるようにするとうまく初期化されていない感じになっていたりしたが、すべてここが原因だった。
以下、本の内容に戻る。

FIFO構造の追加

本の内容の冒頭はとばし、FIFOキューをつくるところから開始する。
fifo.rs という別ファイルを追加し、本に従って、以下のようにFIFOキューをつくる。

あとで static として使いたいので、 Cell, RefCell を使って内部変更ができるようにしておく。size だけは初期化時に決まるので、変更する必要がない。
また、実際にバッファを保持するbufは128バイトを固定で確保し、その中のsizeの分だけを使うようにしている。const generics を使えばこの辺りも柔軟に書けるが、まだnightlyでも部分的にしか実装がされていないようだったので、今回は避けた。
get, put などエラーを返す可能性があるものはRustらしくResultを返すようにした。

キーボード入力の検知

上記のFIFOキューを使って、キーボード入力時に画面にキーコードを表示できるようにする。
まず、冒頭で紹介したとおり、 lazy_static が使用できるようになったので、lazy_static でキーボード入力用のFIFOキューを初期化する

前回作成した inthandler21 を変更し、 KEYBUF に入力されたキーを詰めていくだけの関数にする。

最後に、lib.rsのループで、 KEYBUF にデータが詰まっていたら画面に表示されるようにする。

キーボード入力実行結果

以下のようにキーボードの入力に追随して表示文字が切り替わるようになった。

キーボード入力

マウスの入力検知

次にマウスの入力も検知できるようにする。
マウスの入力を検知するにはキーボード制御装置の初期化処理が必要になる。

ほぼC言語の実装と同じなので詳しい説明は省く。
呼び出し側はinterrupt.rsとlib.rsに追加する

さらに、キーボードの場合と同様、ループで画面に表示する処理を追加する

これでキーボード入力の表示の右側にマウスの入力も表示されるようになった。

マウス入力実行結果

以下の通り、キーボード入力表示の隣りにマウス入力が表示され、それが変化していることがわかる。

マウス入力

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

今回は lazy_static の問題が解消したのが大きかった。早速8日目もとりかかりたい。