Ubuntu 18.04.1 LTSでやる 30日OS本 〜20日目〜

Ubuntu 18.04.1 LTSでやる 30日OS本、20日目です。 他の章へのリンクはここにあります。

1. プログラムの整理

作業量が多いのでバグを埋め込んでしまわないか心配でした。

新しく関数を書いて、その中に自分が書いたものカット & ペーストして編集、とするとミスが減らせそうな気がします。 他に簡単にできる手段としては、こまめに実行してみて様子を見るとかでしょうか。

2. 一文字表示API(1)

hlt.asmの冒頭、本では[BITS 32]となっていますが、NASMの場合は角括弧を除いてbits 32とすれば良いみたいです。

bootpack.mapというファイルはリンカにオプションを渡すことで生成できます。 リンカはldなのでman ldでオプションを調べると、-Map [ファイル名]が欲しかったものだとわかります。 gccからやる場合もldのマニュアルに答えがあって

gcc (中略) -Wl,-Map=bootpack.map

のようになります。ちなみに-Xlinker -Map -Xlinker bootpack.mapのようにも書けます。

前回のMakefileの変更で中間ファイルを生成するようにしたため、bootpack.hrb生成の段階ではリンクしかしていません。 リンカオプションを渡したいのにGCCを経由するのは回りくどいと感じたので、次のようにリンカldを直接呼ぶようにしました。

bin/bootpack.hrb: $(OBJS) src/har.lds Makefile
    ld -o $@ $(OBJS) -e os_main -Map lst/bootpack.map -m elf_i386 -T src/har.lds

asm_cons_putcharglobalしておく必要があります。

3. 一文字表示API(2)

hlt.asmの冒頭にbits 32を入れないと、この節での修正を加えても異常終了してしまうようです。 出来上がったhlt.hrbを確認してみると、call 番地に当たる部分の長さが異なっているっぽいです。

4. アプリケーションの終了

再びbootpack.mapを見てアドレスを書き換えます。ここでも本に載っている例とは異なっているはずです。

5. OSのバージョンが変わっても変わらないAPI

set_gatedescの引数として渡したいので、asm_cons_putcharの宣言

void asm_cons_putchar(void);

bootpack.hに追記します。

6.・7.

はい

8. 文字列表示API

文字列表示用の関数を作ったことでコードがかなりわかりやすくなったと感じます。

また、今まではコマンドが不正なときのメッセージなどをputfonts8_asc_shtで直書きしていました。 つまり、「Bad command.」ではなく「command 'hoge' not found.」のような表示をしようとしたときに、hogeが長いと出力がはみ出す状態だったということです。 これが文字列表示用の関数(cons_putchar経由)で表示するようになったことでいい感じに折り返されるようになりました。安心ですね。