20日目(アドレスの確認、アプリの修正)
すっかりのんびりしているが、自作OSの続き。
ようやく3分の2まで完了させることができた。
ただ、この辺りまでで自分が知りたかったことはだいたいやってみたと思う。
(理解できたかどうかはともかく)
そろそろまた最初からやり直すかと考えたが、やはり一度は通して全部やっておくことにする。
さっそく最初のAPIで一文字表示させるところ、BIOSでもあったと書いてあったが2日目の内容をすっかり忘れていたので読み返し。思い出すのに苦労した。
Haribot17aは修正のみ(タイプミス注意)。
それといつものことだが、またbootpack.hの書き換えを忘れていた。
console.cとfile.cのところに増えた関数を追加。しかしharib17bでエラー。
自分の環境(Linux)でのアセンブラの書き方をすっかり忘れていた。
本書をそのまま書き写すとエラーになる。念のためやったことをメモ。
naskfunc.nasのsection .textに追加
GLOBAL asm_cons_putchar
GLOBAL asm_cons_putchar EXTERN cons_putchar
最後のasm_cons_putcharに追加
asm_cons_putchar:
(略)
CALL asm_cons_putchar
ADD ESP,12
RET
bootpack.hの/* naskfunc.nas */にも
void asm_cons_putchar(void);
を追加するのを忘れないように。
これで$ make -r haribote.imgして、一応通る。でもこの時点では起動してもフリーズする。
次にアドレスの問題。
本書との環境の違いで、Linuxで作成している人たちは皆同じ苦労をしている。
おかげで解決方法はすぐ見つかった。
いつも参照させていただいているブログと同じように、mapファイルを作ってみる。
Makefileのリンカファイルのところに
bootpack.bin: (略)
ld -Map=bootpack.map -m elf_i386 -e HariMain -o bootpack.bin -T (略)
要はldコマンドの後に「-Map=bootpack.map」を追加しているだけ。
bootpack.mapを開くと、自分の環境では
0x0000000000002ec9 asm_cons_putchar
が見つかった。
これを元にharib17cでこれを元にharib17cでhlt.nasの番地の指定を
CALL 2*8;0x2ec9
として、OSが反応しなくなったけど成功(らしい)。
しかしその後harib17cの後半でRETをRETFにしても、hltを入力後、戻ってこない。
他のコマンドは動くので、アプリだけがうまくいっていない。
どうしてもわからないので、harib17dに進んでmapファイルも更新してみたがやはり同じ。
悩んだものの、結局hlt.nasをコンパイルするのを忘れていただけだった。
前回すでにMakefile内でharibote.imgにhlt.hrbをmcopyするコマンドを追加していたが、その前に
hlt.hrb : hlt.nas
nasm hlt.nas -o hlt.hrb
を追加した。
これでmake runしてコンソール内のhltコマンドで文字が出力されるようになり、ようやく成功。
今回コンソール関連のコードのタイプミスだと思いこんでいたため、console.cに書き込んでいたstrcmpとstrncmp関数を別ファイルにしてしまった。
結局この関数のせいではなかったんだが、直すのもまた面倒なのでそのまま続ける。
harib17dまで動くようになったが、疲れたのでここまでにしておく。
20日目の後半戦はまた後日。
今回参照させて頂いたサイト:
http://bttb.s1.valueserver.jp/wordpress/blog/2018/02/19/makeos-20/