非情報系インフラエンジニアの情報系お勉強

OS自作、ネットワーク、セキュリティの備忘録

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命令については、下記リンクを参照

www.nasm.us

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のマニュアルについては下記を参照

manpages.ubuntu.com

そのほか参考にしたページ

yuh.hatenadiary.jp

4.Make, Makefileについて

Make, Makefileとは?

Makeはプログラムのビルドを自動化するツールであり、ビルドの方法はMakefileに記述する。

make - Wikipedia

WSLのubuntu初期設定ではmakeはインストールされていないため、下記コマンドでインストールを行う。

$ sudo apt install make

基本的な書式

Makefileの基本的な書式①

target: prerequisite
  recipe
名前 説明
target 出力するファイル名。makeコマンドを実行する際の引数でも使用する。targetの後には:を記述する
prerequisite targetを出力する際の入力ファイル。複数の場合は半角スペースで区切る
recipe コマンドを記載する。prerequisiteが一つでも変更されていれば実行する。行頭は必ずTABを入力しなければならない

Makefileの基本的な書式②

clean:
  recipe
名前 説明
clean targetはcleanprerequisiteはとらない
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 iplipl.binを作成し、make imghelloos.imgを作成した。

targetを省略するとMakefileの先頭targetを実施する。

GNUのmakeマニュアル

www.gnu.org

その他参考にしたページ

shin.hateblo.jp