ねこめもmkII(マークツー)

本家ねこめも (http://nekomemo2.site)の補助用。 主に勉強ネタ。

21日目(C言語でアプリケーション)

かなり時間が経っているが、引き続きやっていることをメモする。
正直やりたいことがだいたい終わってるし他にやりたいことがたくさんあるので、ここから先は進めるかどうか悩んでいる。
C言語がわかっていないのでかなり厳しいが、今のところやれるところまでやっておくことにする。

harib18aでconsole.cの編集。0xfec は使ったので、oxfe8を使う。
それはいいんだが、本書と環境が違うため、Makefileの編集がかなり難しくなってきた。
hello2の時は、作ったアプリを手動でhrbファイルにしてから、

 $ nasm hello2.nas -o hello2.hrb

でhello2.hrbを作ってあること前提で、Makefikeに

 haribote.img : ipl10.bin haribote.sys hello2.hrb #最終的なimgファイル
 mformat -f 1440 -C -B ipl10.bin -i haribote.img ::
 mcopy -i haribote.img haribote.sys ::
 mcopy -i haribote.img hello2.hrb ::

と、書き加えておいた。

ここまでは良かった(?)けど、harib18bでものすごくつまづいた。
本文の内容そのものではなく、自分の環境でC言語のアプリケーションをコンパイルする方法が全然わからなかった。
でも結局、いつも参照させてもらっているブログに詳細が書いてあったので、ほぼそのままで実行することができた。
やっていることは参照先そのままだが、一応書いておく。

a.cファイルは本書そのままで作成する。
a_nasm.asmの方はnasmに合わせて修正する。(参照先を見たほうが早いです)
リンカファイルも準備しておく。参照先通りに作成すると、ファイル名はapi.ls。

その後コマンドで.oファイルに変換。

 $ gcc -fno-pic -c -m32 -o a.o a.c
 $ nasm -f elf32 -o a_nasm.o a_nasm.asmapi.ls

ファイルをリンク。

 $ ld -m elf_i386 -e HariMain -o a.hrb -Tapi.ls a_nasm.o a.o

最初、gccで「-fno-pic」を付けなくてエラーが出る罠にハマった。
エラーはリンク時で出てくるので、解りづらい。

 $ ld -m elf_i386 -e HariMain -o a.hrb -Tapi.ls a_nasm.o a.o
 a.o: 関数 `HariMain' 内:
 a.c:(.text+0xd): `_GLOBAL_OFFSET_TABLE_' に対する定義されていない参照です

付ければエラーはすぐ出なくなった。

その後にimgファイルを作成、手動で起動。

 $ make img
 $ qemu-system-i386 -m 32 -fda haribote.img -enable-kvm

この時点では、アプリケーションaはまともに動いてくれない。
ここでa.hrbの最初の6バイトを書き換える。

 $ ghex a.hrb

「e8 16 00 00 00 cb」に変更。
haribote.imgを一旦消してimgファイルを作り直してからもう一度起動すると、aが動くようになった。

 $ rm haribote.img
 $ make img
 $ qemu-system-i386 -m 32 -fda haribote.img -enable-kvm

これを確認してから、最後にまたconsole.cを編集し、新しく作成したhello.cファイルも動くことを確認。

ここまでで力尽きたので、21日目はまだ続く予定。

 


今回参照させて頂いたサイト:
http://bttb.s1.valueserver.jp/wordpress/blog/2018/02/23/makeos-21/
https://vanya.jp.net/os/haribote.html

20日目(アプリケーション改善)

20日目の後半。
前回までのなんとかアプリケーションを動かす(文字を表示させる)というところから、さらにわかりやすく、使いやすく(?)しようとしている。
やることはあまり難しくないが、いつものことながら内容の理解が大変。

まずharib17eから。 
IDTについてすっかり忘れてたので6日目を読み直す。
ここら辺は理解するのにものすごく苦労した記憶しかない。なのにだいぶ忘れている。これでまた時間がかかってしまう。
IRQはInterrupt ReQuest、割り込み要求ということですね。(忘れてたので復習)
135ページに記載がなかったので、どういう意味か探しまくってしまった。

harin17fで最初、表題の意味がわからなかったのは自分だけだろうか。
そういえば今のままではhltという名前以外で、コマンドを使えない状態だった。
これを直して完了。なのでアプリケーションをコンパイルするときは注意しないといけない。
ファイル名が変わったのにコンパイル時のコマンドで名前を変えるのを忘れてて、動作が変わらなくてしばらく悩んだ。

次のharin17gでは、自分の環境ではhを出すどころか一瞬画面が消えるエラーになって、何も表示されなかった。
ここは環境の違いもあるのであまり深く考えずそのまま続けて、次のnaskfunc.nasの修正でやっぱり直った。
あいかわらず、5,6日目でも苦労した環境の違いがたまに問題を起こす。でもめげない。

最後ので「¥n」の意味を初めて知った。
Arduinoのスケッチなどで文字列を表示させる際よく使っていたが、こんなところで知るとは。なかなか面白い。

今回も、今までやってきたおさらいで構造を理解するのが苦労した。
あまりはっきりしないままだったが、とにかくアプリケーションを問題なく動かすようにするために、OS側を改善してるんだろうということはわかった。
これをプログラムを書くときに応用できると良いと思うが、そこまでできるようになるには先が長そうだ。

 


今回参照させて頂いたサイト:
http://kentakudo.hatenablog.com/entry/2018/03/31/225753

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/