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_putchar
はglobal
しておく必要があります。
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
経由)で表示するようになったことでいい感じに折り返されるようになりました。安心ですね。