Closed16

ゼロからのOS自作入門の開発環境を macOS で整える

takuchalletakuchalle

「ゼロからのOS自作入門」の公式の開発環境はx86-64 版の Ubuntuですが、macOS でも開発環境を整えてみる。

takuchalletakuchalle

公式ではansibleを使ってるが、Ubuntu向けなので macOS では使えない。ansibleファイルを参考に必要そうツールをインストールする。

自分の環境ではとりあえずllvm acpica nasm dosfstools をインストールした。

$ brew install llvm acpica nasm dosfstools

/usr/local/Cellar/dosfstools/4.2/sbin /usr/local/opt/llvm/bin/にもパスを通した。

takuchalletakuchalle
$ cd $HOME
$ git clone https://github.com/uchan-nos/mikanos-build.git osbook
$ git clone --recurse-submodules https://github.com/tianocore/edk2.git edk2

公式ドキュメント通り$HOMEにクローンする。

edk2はサブモジュールを使っていて--recurse-submodulesオプションをつけてなくてしばらくハマった。

takuchalletakuchalle

ビルドスクリプトなどで$HOMEにあることを前提になってるので、ここにあると今後が楽。
ただホームディレクトリ直下にあるのは気持ち悪い。

takuchalletakuchalle

edk2に必要なファイルを事前にビルドしておく。

$ cd $HOME/edk2/BaseTools/Source/C
$ build

なにかエラーが出たら必要なツールがインストールされてない可能性があるから、エラーを見て対処する

takuchalletakuchalle

ビルド済み標準ライブラリを持ってくる

$ cd $HOME/osbook/devenv
$ curl -OL https://github.com/uchan-nos/mikanos-build/releases/download/v2.0/x86_64-elf.tar.gz
$ tar -zxf x86_64-elf.tar.gz

これらのライセンスはこちらを参照。

takuchalletakuchalle

MikanOS の本体も$HOMEにクローンする。

$ git clone https://github.com/uchan-nos/mikanos.git
takuchalletakuchalle

ドキュメントにあるようにセットアップする

$ cd $HOME/edk2
$ ln -s /path/to/mikanos/MikanLoaderPkg ./
$ source edksetup.sh
takuchalletakuchalle

Conf/target.txtの設定項目を以下のように修正する

設定項目 設定値
ACTIVE_PLATFORM MikanLoaderPkg/MikanLoaderPkg.dsc
TARGET DEBUG
TARGET_ARCH X64
TOOL_CHAIN_TAG CLANGPDB

CLANG38の部分をCLANGPDBにした。

takuchalletakuchalle
$ $HOME/edk2
$ build

ビルドするとBuild/MikanLoaderX64/DEBUG_CLANGPDB/X64/Loader.efiが生成される。

takuchalletakuchalle
$ source $HOME/osbook/devenv/buildenv.sh
$ cd $HOME/mikanos
$ ./build.sh

環境変数などを読み込んで、ビルドする。

takuchalletakuchalle
objcopy -I binary -O elf64-x86-64 -B i386:x86-64 hankaku.bin hankaku.o
make: objcopy: No such file or directory

objcopy がない。

takuchalletakuchalle
diff --git a/kernel/Makefile b/kernel/Makefile
index 9d39343..ba84e1c 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -50,7 +50,7 @@ hankaku.bin: hankaku.txt
        ../tools/makefont.py -o $@ $<
 
 hankaku.o: hankaku.bin
-       objcopy -I binary -O elf64-x86-64 -B i386:x86-64 $< $@
+       llvm-objcopy -I binary -O elf64-x86-64 -B i386:x86-64 $< $@
 
 .%.d: %.bin
        touch $@

とりあえずllvm-objcopyを使ってみる。
再度ビルドするとローダーのパスでエラー。

+ echo 'No such file: /Users/takuya/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi'
No such file: /Users/takuya/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi
takuchalletakuchalle

$HOME/osbook/devenv/make_mikanos_image.shを編集する。

diff --git a/devenv/make_mikanos_image.sh b/devenv/make_mikanos_image.sh
index 4607e28..f215eef 100755
--- a/devenv/make_mikanos_image.sh
+++ b/devenv/make_mikanos_image.sh
@@ -18,7 +18,7 @@ then
   MIKANOS_DIR="$HOME/osbook/$1"
 fi
 
-LOADER_EFI="$HOME/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi"
+LOADER_EFI="$HOME/edk2/Build/MikanLoaderX64/DEBUG_CLANGPDB/X64/Loader.efi"
 KERNEL_ELF="$MIKANOS_DIR/kernel/kernel.elf"
 
 $DEVENV_DIR/make_image.sh $DISK_IMG $MOUNT_POINT $LOADER_EFI $KERNEL_ELF
takuchalletakuchalle
+ sudo mount -o loop ./disk.img ./mnt

ここから先が分からない。
どうやってマウントするんだ。

このスクラップは2021/03/24にクローズされました