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

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

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