3日目(C言語の壁)
本書の内容よりも、Ubuntu上でどうC言語を扱って進めていくかの問題になる。
ホームのtolsetフォルダに、HariboteOS/projects/03_dayのharib00iをコピー。
harib00iから、asmhead.nasとbootpack.cをコピーしてきて中身を確認。
Ubuntu上でC言語を使うために、リンカスクリプトというのが必要なため、他の方のを参照して作成(har.ld)。
内容はほぼコピペ。
---
/* https://qiita.com/pollenjp/items/8fcb9573cdf2dc6e2668 */
OUTPUT_FORMAT(binary)
OUTPUT_ARCH(i386)
SECTIONS {
. = 0x7c00;
.text : { *(.text) }
}
---
Makefileもコピペに近いが、後でエラーが出て修正するので、最後に書く。
ここでとうとうharibote.nasはやめ、harib00iからコピーしてきたamshead.nasをそのまま使った。
しかしエラーになった。
主要な内容はこんな感じ。
$ make run
nasm asmhead.nas -o asmhead.bin -l asmhead.lst
asmhead.nas:58: error: unrecognised directive [INSTRSET]
Makefile:11: recipe for target 'asmhead.bin' failed
原因は、asmhead.nasをnasmコマンド用に編集する必要があった。
以下の箇所はいらないので、削除かコメントアウト。
[INSTRSET "i486p"] ; 486の命令まで使いたい
という記述
ついでに前と同じように、RESBのところはTIMESとDB 0に書き換え。
まだワーニングが出るので、
ALIGNB 16
を
ALIGNB 16, DB 0
に書き換えた。必須ではないかもしれない。
だがまだ
bootpack.c:(.text+0x9): `_GLOBAL_OFFSET_TABLE_' に対する定義されていない参照です
と言うエラーが出た。
これはMakefile中のgccコマンドに-fno-picというオプションを追加して修正できた。
これでmake runして黒画面、成功。
あともう少し、今度はharibot00j/naskfunc.nasをコピーしてくる。
HLT処理はC言語で生成できないので、アセンブラで関数を定義。
nasmfunc.nas
---
; naskfunc
; TAB=4
section .text
GLOBAL io_hlt
io_hlt: ; void io_hlt(void);
HLT
RET
---
bootpack.cも編集。
---
// bootpack.c
externvoidio_hlt(void);
voidHariMain(void)
{
fin:
io_hlt();
goto fin;
}
---
make runでまたエラー。
make[2]: *** 'nasmfunc.o' に必要なターゲット 'nasmfunc.nas' を make するルールがありません. 中止.
これはファイル名がオリジナルのnaskfunc.nasという名前のままになっていただけ。
Makefileの記載通りnasmfunc.nasという名前に変更して、今度こそ黒画面が起動して成功。
Makefile最終
---
# ファイル生成規則
default:
make img
ipl.bin : ipl.nas Makefile
nasm ipl.nas -o ipl.bin -l ipl.lst
asmhead.bin : asmhead.nas Makefile
nasm asmhead.nas -o asmhead.bin -l asmhead.lst
nasmfunc.o : nasmfunc.nas Makefile # nasmfunc.nasのバイナリファイル作成
nasm -g -f elf nasmfunc.nas -o nasmfunc.o
bootpack.hrb : bootpack.c har.ld nasmfunc.o Makefile # リンカスクリプトを使用
gcc -march=i486 -m32 -nostdlib -T har.ld -g -fno-pic bootpack.c nasmfunc.o -o bootpack.hrb
haribote.sys : asmhead.bin bootpack.hrb Makefile
cat asmhead.bin bootpack.hrb > haribote.sys
haribote.img : ipl.bin haribote.sys Makefile
mformat -f 1440 -C -B ipl.bin -i haribote.img ::
mcopy haribote.sys -i haribote.img ::
# コマンド
asm :
make -r ipl.bin
img :
make -r haribote.img
run :
make img
qemu-system-i386 -fda haribote.img # -fda追加
clean :
rm *.lst *.bin *.sys *.img *.hrb *.o
---
ファイルが大量になるので、cleanコマンドを使えるようにした。
ようやく三日目が完了。
今回参照させて頂いたサイト:
https://qiita.com/pollenjp/items/8fcb9573cdf2dc6e2668
https://vanya.jp.net/os/haribote.html
http://www.ertl.jp/~takayuki/readings/c/no09.html
http://hrb.osask.jp/wiki/?tools/nask
https://github.com/harrybotter30/haribote/blob/master/doc/harib00i.md#haribotehrb-%E3%81%AE%E4%BD%9C%E6%88%90
3日目(またMakefile編集、32bitへ)
ipl.nasとharibote.nasはharib00g.nasまで写経。
しかし最初はエラーが出たり、前と同じ「Booting from Floppy…」としか出てこない。
なにかおかしいと思ったら、ipl.nasでかなりミスタイプと行の間違いをしていた。これを修正。
他の方が使っていたのでただなんとなくmformatやmcopyをMakefileに追加していたが、これらのmtoolの謎は解明。
MSDOS、というかFATファイルシステムに対するコマンドだった。
今回の自作OSをLinux上で行うには、これは便利。
それと後で知ったが、拡張子がbinだったりsysだったりするのは、nasmのコマンドでは拡張子は関係ないため。
これでharibote.nasも含めたimgファイル作成のためのMakefileを作成できる。
また後で編集する可能性もあるが、 結局他の方のブログを参照して現時点では以下の通り。
ファイル名称は変えていない。
---
# ファイル生成規則
default:
make img
ipl.bin : ipl.nas Makefile
nasm ipl.nas -o ipl.bin -l ipl.lst
haribote.sys : haribote.nas Makefile
nasm haribote.nas -o haribote.sys -l haribote.lst
haribote.img : ipl.bin haribote.sys Makefile
mformat -f 1440 -C -B ipl.bin -i haribote.img ::
mcopy haribote.sys -i haribote.img ::
# コマンド
asm :
make -r ipl.bin
img :
make -r haribote.img
run :
make img
qemu-system-i386 -fda haribote.img # -fdaを追加
---
当初コマンド入力だと問題ないのに、 make runするとエラーが出て悩んだ。
Makefile:5: *** 分離記号を欠いています. 中止
というエラー。
調べたところ、上記のエラーはMakefileの5行目にtabだけではなくスペースが入っているというだけのエラーだった。
Makefileはtabのみでないとエラーになると、初めて知った。
ファイルを直して、make runで真っ黒なだけの画面が出てきて成功。
次に32bitモードの準備として、haribo00hのhaibote.nasを写経。
わからないことだらけだが、ここでは特に動作確認はない。
C言語に入る前に、いったん区切る。
余談だが、このあたりで参照しているサイトが日々ダブるようになってきた。
そのぐらい、いろんなところを行ったり来たりしている。
参照
https://qiita.com/Aquan_Investor/items/1843f0c7ba31a12f6446
https://wisteria0410ss.hatenablog.com/entry/2019/02/06/131021
http://bttb.s1.valueserver.jp/wordpress/blog/2017/11/25/makeos-3-1/
https://www.itmedia.co.jp/help/tips/linux/l0317.html
3日目(OS本体まで写経)
今回やったことは、主に本家のファイルと本書を参考にしながら、ひたすらipl.nasファイルを写経。
ホームのtolsetフォルダに、HariboteOS/projects/03_dayにあるharib00aフォルダをコピー。
ipl.nasファイルのみにする。
2日目に作ったMakefileもコピー。ファイルは2つだけでスッキリした。
ちなみにmake run時のコマンドでしれっと-fdaというオプションが追加されているが、これはフロッピーのイメージを作成するためのもの。
後々、これが必要になってくるらしい。
今回はharib00aフォルダのipl.nasファイルを元に、本書の通りに徐々に追記をして動作を確認することにした。
ブートセクタについては、これは根性で覚えるしかないかもしれない。
詳細は、他の方が説明しているのでここでは特にしない。
ここではあくまでも、やった事をメインで書き残しておく。
最初にフロッピーディスクの起動失敗時の対策箇所を追記。
例のRESBをTIMESに変更するところも反映。
この状態で一度imgファイルを作成して実行してみる。と、エラーでもないがブートしただけの画面が出てくる。
これはこれで成功。
ファイルを新しくせず、元ファイルを見ながらharib00aフォルダのままさらにipl.nasに追記(写経)していく。
OS本体であるharibote.nasも作成。
imgファイルを作成する。
Makefileはまだharibote.nasに対応するようにできていないので、コマンドで実行。
$ nasm haribote.nas -o haribote.sys -l haribote.lst
$ mformat -f 1440 -C -B ipl.bin -i haribote.img
$ mcopy haribote.sys -i haribote.img
ここでエラーというかワーニングがでた。
File "./haribote.sys" exists. To overwrite, try again, and explicitly specify target directory
これは最後に「::」を入れると出なくなった。
$ mcopy haribote.sys -i haribote.img ::
最終的にできた haribote.imgを開いて、中身を確認。
$ ghex haribote.img
0x002600と0x004200あたりを確認して、本書と同じデータが入っている事を確認。
mcopyというコマンドを使うのだが、詳細は別途調べることにする。
名称の変更は、自分が解りづらくなるのでまたちょっと後。
OS本体の動作確認は次回にする。
参考にさせて頂いたサイト:
https://hariboteos.hatenadiary.org/entry/20060304/1141476623
https://qiita.com/pollenjp/items/8fcb9573cdf2dc6e2668