ねこめも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

3日目(またMakefile編集、32bitへ)

ipl.nasとharibote.nasharib00g.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