LoginSignup
0
0

More than 3 years have passed since last update.

作って理解するOSのためのMakefileを作ってみた (Ubuntu18.04)

Posted at

はじめに

作って理解する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で実行できます。

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で作りました。

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しているファイルに変更があっても再コンパイルは行われません。そこで、指定フォルダ以下にあるファイルを依存関係に含めるようにします。

Makefile
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/以下に存在するファイルが更新された場合に、再コンパイルされるようになります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0