Ubuntu 18.04.1 LTSでやる 30日OS本 〜19日目〜
Ubuntu 18.04.1 LTSでやる 30日OS本、19日目です。 他の章へのリンクはここにあります。
Githubにソースコードを公開しました(https://github.com/wisteria0410ss/os)。
1. typeコマンド
再び文字列比較が微妙です。前回同様の流れで次の節でstrncmp
を使うことになるのですが、これも自分で書くことになります。
strcmp
のn文字目で打ち切るようにすればいいのでほぼコピペですが。
どうせ自分で書くのでstrncmp
にこだわる必要はなく、starts_with
をなどを作るのも手だと思います。私は呼び出し時のnの指定をサボりたかったので
starts_with
を書きました。
また、type
コマンドを試すにあたって何らかのテキストファイルをディスクイメージに放り込む必要がありますが、これはharibote.sys
を書き込むのと
全く同様の方法でできます。
2. typeコマンド改良
表示できても画面が小さいとうまくいっているかもわかりにくいです。解像度を上げてコンソールの大きさを広げたほうが良い気がしてきました。
私はここまで実機で1920×1080、エミュレータだと(対応していないので)320×200というようにしていましたが、 エミュレータでもある程度高解像度で動くよう1920×1080→1024×768→320×200の三段構えに変更しました。 これに合わせてコンソールのウィンドウサイズも大きくしました。
日本語は化けてしまいますが、英数字に関しては問題なく表示されていそうなことが確認できました。
また、画面を大きくしたら入力可能な最大文字数も増えるので、配列のサイズを溢れない程度まで広げました。
3. FATに対応
はい。本文の通り、うまくいっていると「信じる」ことにしました。
4. ソースの整理
ファイル分割をします。ところで、ファイルを増やすたびにMakefileに書き足すのは正直面倒です。
ワイルドカードなどを使ってやればその手間を省けるようなので、Makefileにも手を加えることにしました。今まではgcc
にCのファイルを指定しまくって
中間ファイルをあまり出さないようにしていましたが、少しの変更のたびに全体をコンパイルするのも良くないということで*.o
を生成する段階を挟むようにします。
ただ、中間ファイルが散らかるのも気になるのでディレクトリを分けることにしました。
ここでのディレクトリ構造はこんな感じです。
- src
- ソースコードを入れる。ヘッダファイルもアセンブリもフォントデータのテキストもリンカスクリプトも考えるのが面倒なので全部ここ。
- obj
- コンパイルしてできたオブジェクトファイルを入れる。
- bin
- イメージファイル以外のバイナリを入れる。
- lst
- アセンブルしたときに生成していた`*.lst`の置き場。
- util
- ツールっぽいものを置こうと思ったが、フォントデータから`hankaku.c`を作るやつくらいしか置くものがない。
haribote.img
は何となくトップに直接生成することにしました。ごちゃごちゃしたものが編集するものと隔離されてちょっといい感じになりました。
このもとでのMakefile
を貼りたいのですが、縦に長いのでgithubに公開したものを見てください。
.gitignore
の関係で一部ディレクトリは見えていません。
ファイル分割のたびに書き足す手間を省いてくれる部分は
OBJS := $(patsubst src/%.c,obj/%.o,$(filter-out src/hankaku.c src/test.c,$(wildcard src/*.c))) obj/hankaku.o obj/func.o
で、これはbootpack.hrb
を生成するのに必要なオブジェクトファイルを列挙するものです。
何をしているかというと
wildcard
でCのソースファイルを全列挙filter-out
で一部を除く。test.c
はsprintf
やstrcmp
など自分で書いた関数のテスト用のため、hankaku.c
は自動生成されるファイルで存在が保証されないために除いています。src/なんとか.c
をobj/なんとか.o
に置換- 上で挙げたCのプログラムからできるのではないオブジェクトファイル(
hankaku.o
とfunc.o
)を追加
という感じです。
5. ついに初アプリ
アプリ関係はapp
というディレクトリに入れることにしました。コンパイルは~~~.asm
から~~~.bin
を作るのと同様にすればよく、
できたファイルはイメージに放り込みます。なので、Makefile
には
bin/hlt.hrb: app/hlt.asm Makefile nasm $< -o $@
を追記し、ディスクイメージに入れるファイルを列挙しているFILES
にbin/hlt.hrb
を加えました。
アプリが増えてきたらオブジェクトファイル同様ワイルドカードで入れるようにするつもりです。