ゼロからのOS自作入門の開発環境を macOS で整える
「ゼロからのOS自作入門」の公式の開発環境はx86-64 版の Ubuntuですが、macOS でも開発環境を整えてみる。
公式では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/にもパスを通した。
$ 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オプションをつけてなくてしばらくハマった。
ビルドスクリプトなどで$HOMEにあることを前提になってるので、ここにあると今後が楽。
ただホームディレクトリ直下にあるのは気持ち悪い。
edk2に必要なファイルを事前にビルドしておく。
$ cd $HOME/edk2/BaseTools/Source/C
$ build
なにかエラーが出たら必要なツールがインストールされてない可能性があるから、エラーを見て対処する
ビルド済み標準ライブラリを持ってくる
$ 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
これらのライセンスはこちらを参照。
MikanOS の本体も$HOMEにクローンする。
$ git clone https://github.com/uchan-nos/mikanos.git
ドキュメントにあるようにセットアップする
$ cd $HOME/edk2
$ ln -s /path/to/mikanos/MikanLoaderPkg ./
$ source edksetup.sh
Conf/target.txtの設定項目を以下のように修正する
| 設定項目 | 設定値 |
|---|---|
| ACTIVE_PLATFORM | MikanLoaderPkg/MikanLoaderPkg.dsc |
| TARGET | DEBUG |
| TARGET_ARCH | X64 |
| TOOL_CHAIN_TAG | CLANGPDB |
CLANG38の部分をCLANGPDBにした。
$ $HOME/edk2
$ build
ビルドするとBuild/MikanLoaderX64/DEBUG_CLANGPDB/X64/Loader.efiが生成される。
$ source $HOME/osbook/devenv/buildenv.sh
$ cd $HOME/mikanos
$ ./build.sh
環境変数などを読み込んで、ビルドする。
objcopy -I binary -O elf64-x86-64 -B i386:x86-64 hankaku.bin hankaku.o
make: objcopy: No such file or directory
objcopy がない。
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
$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
+ sudo mount -o loop ./disk.img ./mnt
ここから先が分からない。
どうやってマウントするんだ。
どうやらhdiutilを使うらしい。
完全版が出たので、これはクローズする。