#はじめに
作って理解するOSで使っているソースコードはWindows環境で動くように書かれていますが、これをUbuntu18.04のMakefileで動かします。
といっても30日でできる! OS自作入門と違い独自ツールなどを使っていないので、コードは変更せずに実行コマンドを変えるだけで良いようです。
#環境
$ uname -a
Linux furble 5.3.0-51-generic #44~18.04.2-Ubuntu SMP Thu Apr 23 14:27:18 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
$ nasm -v
NASM version 2.13.02
$ qemu-system-x86_64 --version
QEMU emulator version 2.11.1(Debian 1:2.11+dfsg-1ubuntu7.23)
$ make --version
GNU Make 4.1
Built for x86_64-pc-linux-gnu
#14_keyboard_ledまでのMakefile
14_keyboard_ledまではファイルが一つだけなので、以下のMakefileで実行できます。
MAKE = make -r
NASM = nasm
ASM_FILES = boot
IMG = haribote.img
# デフォルト動作
default :
$(MAKE) img
# ファイル生成規則
$(ASM_FILES).bin : $(ASM_FILES).asm Makefile
$(NASM) $(ASM_FILES).asm -o $(ASM_FILES).bin -l $(ASM_FILES).lst
$(IMG) : $(ASM_FILES).bin Makefile
cat $(ASM_FILES).bin > $@
# コマンド
asm :
$(MAKE) $(ASM_FILES).bin
img :
$(MAKE) $(IMG)
run :
$(MAKE) img
qemu-system-x86_64 -usb -drive file=$(IMG),format=raw
#install :
# sudo dd if=./$(IMG) of=/dev/sde
clean :
-rm *.bin
-rm *.lst
src_only :
$(MAKE) clean
-rm $(IMG)
ここではアセンブリファイルの拡張子をgasの.sからnasmの.asmに変えていますが、別に変えなくても動くはずなので、面倒であればそのままで良いと思います。
変える場合は、コード内%includeディレクティブのファイル名と、それの指す元ファイルの拡張子をすべて.asmに変えます。
##usbメモリへの書き込み
上のMakefileのinstallの箇所ではimgファイルを/dev/sdeへ書き込んでいますが、これは自分の場合なので各々の環境に合わせて変えてください。fdiskコマンドでデバイス名が調べられます。
今回は2GBのUSBを使っているので、/dev/sdeがusbメモリだと分かります。
$ sudo fdisk -l
(中略)
Disk /dev/sde: 1.9 GiB, 2021654528 bytes, 3948544 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000
なおこのddコマンドは指定デバイスを間違えるとHDDやSSDの内容がすべて消えてしまう可能性があるので、慎重に行ってください。
#15_load_kernel以降のMakefile
作って理解するOSの15_load_kernelでは、ソースファイルがboot.sのみと、kernel.sもある場合の両方に対応するバッチファイルを作っています。
そこで、これをMakefileで作りました。
MAKE = make -r
NASM = nasm
IMG = haribote.img
ASM_FILES = boot.asm $(shell ls | grep -x kernel.asm) #kernel.asmが存在したら含める
OBJ_FILES = $(ASM_FILES:asm=bin) #拡張子をasmからbinに書き換える
# デフォルト動作
default :
$(MAKE) img
# ファイル生成規則
%.bin : %.asm Makefile
$(NASM) $< -o $@ -l $*.lst
$(IMG) : $(OBJ_FILES) Makefile
cat $(OBJ_FILES) > $@
(以下同じ)
...
#includeしているファイルを依存関係に含める
ここまでのMakefileでは、includeしているファイルに変更があっても再コンパイルは行われません。そこで、指定フォルダ以下にあるファイルを依存関係に含めるようにします。
MAKE = make -r
NASM = nasm
IMG = haribote.img
ASM_FILES = boot.asm $(shell ls | grep -x kernel.asm) #kernel.asmが存在したら含める
INC_FILES = $(shell find ../include/ ../modules/ -type f)
OBJ_FILES = $(ASM_FILES:%.asm=%.bin) #拡張子をasmからbinに書き換える
# デフォルト動作
default :
$(MAKE) img
# ファイル生成規則
%.bin : %.asm $(INC_FILES) Makefile
$(NASM) $< -o $@ -l $*.lst
$(IMG) : $(OBJ_FILES) Makefile
cat $(OBJ_FILES) > $@
(以下同じ)
...
これで../include/と../modules/以下に存在するファイルが更新された場合に、再コンパイルされるようになります。