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の三段構えに変更しました。 これに合わせてコンソールのウィンドウサイズも大きくしました。

日本語は化けてしまいますが、英数字に関しては問題なく表示されていそうなことが確認できました。

f:id:wisteria0410ss:20190222181027p:plain
高解像度にしてstrcmp.cの内容を表示させた様子

また、画面を大きくしたら入力可能な最大文字数も増えるので、配列のサイズを溢れない程度まで広げました。

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を生成するのに必要なオブジェクトファイルを列挙するものです。 何をしているかというと

  1. wildcardでCのソースファイルを全列挙
  2. filter-outで一部を除く。test.csprintfstrcmpなど自分で書いた関数のテスト用のため、 hankaku.cは自動生成されるファイルで存在が保証されないために除いています。
  3. src/なんとか.cobj/なんとか.oに置換
  4. 上で挙げたCのプログラムからできるのではないオブジェクトファイル(hankaku.ofunc.o)を追加

という感じです。

5. ついに初アプリ

アプリ関係はappというディレクトリに入れることにしました。コンパイル~~~.asmから~~~.binを作るのと同様にすればよく、 できたファイルはイメージに放り込みます。なので、Makefileには

bin/hlt.hrb: app/hlt.asm Makefile
    nasm $< -o $@

を追記し、ディスクイメージに入れるファイルを列挙しているFILESbin/hlt.hrbを加えました。 アプリが増えてきたらオブジェクトファイル同様ワイルドカードで入れるようにするつもりです。