30日OS自作入門 3日目、長かった苦労した、追記修正した

3日目ってさ、長くない?しんどくない?


プログラムそのものは理解しなきゃいけないってこともあまりないわけだが、ひたすらMakefileに悩まされるという。


著者さんの自作ツールを使わずに、gcc と NASM と dd でやるためにMakefileに悩むという。

リンカスクリプトなんかわからんわあ。


こちら参考にさせてもらいました。

30日でできる!OS自作入門(3日目)[Ubuntu16.04/NASM] - Qiita



いやあ、良い勉強にはなったが長かった、辛かった。


そこまでがんばっても最終結果は真っ黒画面なんだがなw

ちゃんとそこまで行くだけでうれしいが、ほんとにちゃんと動いてるのかわからんというー。



とりあえず、自分が3日目最後のharib00jで使ったMakefileはこうなった。

修正整理した

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




まったくわからないのでリンカスクリプトもコピーさせてもらったのそのままですが貼っておきます。

/* 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) }
}
view raw har.ld hosted with ❤ by GitHub


そして追記
のちにちゃんと動いていなかったことが判明。

そう、HLT命令に切り替えたのにQEMUのCPU負荷下がってなくて変だなとは思ってたが。

C言語からアセンブラの呼び出しって、アセンブラ側は_アンダーラインつけてC言語側では付けない、んじゃなかったのか。

関数定義されてねえって散々怒られた。


NASMかGCCの仕様なのけ?それともどっかでそう定義されなおしたの?よくわかんね。

このブログの人気の投稿

エレキギター練習用にyousicianとオーディオ入力

Prusa i3 MK3S用 IKEA Lack エンクロージャー作ったぞ、3Dプリンターの入れる箱というか台だ、力作

一筆書きパイロン、花瓶モード(スパイラルモード)で3Dプリント