OS自作入門 2日目/30日(Makefile作成)
OS自作入門 2日目/30日(Makefile作成)
1.はじめに
2日目では、使用するソースファイルの中身についての解説とMakefileについて解説を行う。
その前に、helloos5の躓きどころとして、58行目のRESB 0x7dfe-$
を書き換えるときに、
TIMES 0x7dfe-($-$$) DB 0
としてしまい、正しく実行できない。
正しくは、TIMES 0x7dfe-0x7c00-($-$$) DB 0
ORG命令でメモリの0x7c00から読み込むように指定されているため、その分引く必要がある。
2.使用したアセンブラの命令
NASKの命令(30日本著者作成のアセンブラ) NASMの命令(今回使用のフリーのアセンブラ) において違いなし
命令 | 名前 | 内容 |
---|---|---|
ORG | origin | プログラムの始まりのメモリを明示する |
JMP | jump | 指定のラベルにジャンプする |
MOV | move | 代入を実行 MOV A,Bと記載した場合、A=Bを行う |
ADD | add | 足し算を実行 ADD A,Bと記載した場合、A=A+Bを行う |
CMP | compare | 比較を行う |
JE | jump if equal | 比較命令CMPの結果が正しければ指定のラベルにジャンプ |
HLT | halt | 外部の変化があるまで待機 |
ORG命令については、下記リンクを参照
3.edimg.exeの代役
イメージファイルをブートセクタとその他に分けて作成する方法へ切り替える。利点は、ブートセクタは今後編集する機会が少ないため。
具体的には、ブートセクタをnasm(ファイル名はipl.asmとする)で作成し、残りの部分については別で作成する。その際に、30日本では著者作成のオリジナルツールを使用していたが、代替としてmformat
を使用する。
WSLのubuntu初期設定ではmformatはインストールされていないため、下記コマンドでインストールを行う。
$ sudo apt install mtools
今回使用するmformatの書式は下記の通り
$ mformat -f 1440 -C -B ブートファイル -i 出力ファイル ::
オプションの解説
オプション名 | 説明 |
---|---|
-f | ファイルサイズを指定。1440を指定すると1440kBとなる |
-C | MS-DOSファイルシステムをインストールする用のファイルを作成 |
-B | 指定されたブートストアを書き込む |
-i | マニュアルに記載なし。下記を参照 |
mformatのマニュアルについては下記を参照
そのほか参考にしたページ
4.Make, Makefileについて
Make, Makefileとは?
Makeはプログラムのビルドを自動化するツールであり、ビルドの方法はMakefileに記述する。
WSLのubuntu初期設定ではmakeはインストールされていないため、下記コマンドでインストールを行う。
$ sudo apt install make
基本的な書式
Makefileの基本的な書式①
target: prerequisite recipe
名前 | 説明 |
---|---|
target | 出力するファイル名。makeコマンドを実行する際の引数でも使用する。targetの後には: を記述する |
prerequisite | targetを出力する際の入力ファイル。複数の場合は半角スペースで区切る |
recipe | コマンドを記載する。prerequisiteが一つでも変更されていれば実行する。行頭は必ずTABを入力しなければならない |
Makefileの基本的な書式②
clean: recipe
名前 | 説明 |
---|---|
clean | targetはcleanでprerequisiteはとらない |
recipe | コマンドを記載する。一般的にrm -f 消去したいファイル名 。行頭は必ずTABを入力しなければならない |
Makefileの基本的な書式③
IPL=ipl.bin ipl: ipl.asm nasm ipl.asm -o $(IPL)
任意の文字列を変数として扱うことができる。1行目でIPLを変数として、ipl.binを代入している。 4行目の$(IPL)では、IPLを展開している。4行目は下記と同じ意味になる。
nasm ipl.asm -o ipl.bin
使用したMakefile
IMG=helloos.img IPL=ipl.bin ipl: ipl.asm nasm ipl.asm -o $(IPL) img: $(IPL) mformat -f 1440 -C -B $(IPL) -i $(IMG) :: clean: rm -f $(IMG) $(IPL)
Makeコマンドの使い方
基本的なコマンドは下記の通り
$make target
今回は、make ipl
でipl.binを作成し、make img
でhelloos.imgを作成した。
targetを省略するとMakefileの先頭targetを実施する。
GNUのmakeマニュアル
その他参考にしたページ