30日OS自作入門 3日目、長かった苦労した、追記修正した
3日目ってさ、長くない?しんどくない?
プログラムそのものは理解しなきゃいけないってこともあまりないわけだが、ひたすらMakefileに悩まされるという。
著者さんの自作ツールを使わずに、gcc と NASM と dd でやるためにMakefileに悩むという。
リンカスクリプトなんかわからんわあ。
こちら参考にさせてもらいました。
30日でできる!OS自作入門(3日目)[Ubuntu16.04/NASM] - Qiita
いやあ、良い勉強にはなったが長かった、辛かった。
そこまでがんばっても最終結果は真っ黒画面なんだがなw
ちゃんとそこまで行くだけでうれしいが、ほんとにちゃんと動いてるのかわからんというー。
とりあえず、自分が3日目最後のharib00jで使ったMakefileはこうなった。
修正整理した
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
run: haribote.img | |
qemu-system-i386 -fda $^ | |
ipl10.o: ipl10.asm Makefile | |
nasm ipl10.asm -o ipl10.o -l ipl10.lst | |
asmhead.o: asmhead.asm Makefile | |
nasm asmhead.asm -o asmhead.o -l asmhead.lst | |
naskfunc.o: naskfunc.asm Makefile | |
nasm -g -f elf naskfunc.asm -o naskfunc.o -l naskfunc.lst | |
bootpack.hrb: bootpack.c naskfunc.o har.ld Makefile # Cファイルをリンカスクリプトを用いてコンパイル | |
gcc -march=i486 -m32 -nostdlib -T har.ld bootpack.c naskfunc.o -o bootpack.hrb | |
haribote.sys: asmhead.o bootpack.hrb Makefile | |
cat asmhead.o bootpack.hrb > haribote.sys | |
haribote.img: ipl10.o haribote.sys Makefile | |
echo haribote.sys > haribote.name | |
dd if=ipl10.o of=haribote.img count=2880 bs=512 conv=notrunc | |
dd if=haribote.name of=haribote.img count=1 bs=512 seek=19 conv=notrunc | |
dd if=haribote.sys of=haribote.img count=1 bs=512 seek=33 conv=notrunc | |
img: | |
make -r haribote.img | |
debug: | |
qemu-system-i386 -fda haribote.img -gdb tcp::10000 -S | |
clean: | |
rm -rf *.img *.lst *.sys *.name *.o *.hrb |
まったくわからないのでリンカスクリプトもコピーさせてもらったのそのままですが貼っておきます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* https://vanya.jp.net/os/haribote.html#hrb */ | |
OUTPUT_FORMAT("binary"); | |
SECTIONS | |
{ | |
.head 0x0 : { | |
LONG(64 * 1024) /* 0 : stack+.data+heap の大きさ(4KBの倍数) */ | |
LONG(0x69726148) /* 4 : シグネチャ "Hari" */ | |
LONG(0) /* 8 : mmarea の大きさ(4KBの倍数) */ | |
LONG(0x310000) /* 12 : スタック初期値&.data転送先 */ | |
LONG(SIZEOF(.data)) /* 16 : .dataサイズ */ | |
LONG(LOADADDR(.data)) /* 20 : .dataの初期値列のファイル位置 */ | |
LONG(0xE9000000) /* 24 : 0xE9000000 */ | |
LONG(HariMain - 0x20) /* 28 : エントリアドレス - 0x20 */ | |
LONG(0) /* 32 : heap領域(malloc領域)開始アドレス */ | |
} | |
.text : { *(.text) } | |
.data 0x310000 : AT ( ADDR(.text) + SIZEOF(.text) ) { | |
*(.data) | |
*(.rodata*) | |
*(.bss) | |
} | |
/DISCARD/ : { *(.eh_frame) } | |
} |
そして追記
のちにちゃんと動いていなかったことが判明。
そう、HLT命令に切り替えたのにQEMUのCPU負荷下がってなくて変だなとは思ってたが。
C言語からアセンブラの呼び出しって、アセンブラ側は_アンダーラインつけてC言語側では付けない、んじゃなかったのか。
関数定義されてねえって散々怒られた。
NASMかGCCの仕様なのけ?それともどっかでそう定義されなおしたの?よくわかんね。