すでに、
Mac で始める「ゼロからのOS自作入門」 - yamoridon - Qiita

という @yamoridonさんの素晴らしいQiitaの記事があります!
これをなぞっていけばいいのですが、理解力不足で色々つまずいたので、記録を残しておきます。


1.まずは上記記事の通りに環境構築、動作確認までしてしまった方が良い
EDK II は第2章から使うので、後回しにしたらハマりました。記事通りに環境構築して、第2章の osbook_day02a の Loader.efi が QEMU で動くのを確認した方が早いです。

それから、自分で第1章からやれば、環境構築で悩みません。


2.mac.patch の作り方
次の内容の mac.patch というファイルを作って適用します。
というあっさりした記述がわからず、悩みました。

要は、その下の黒いバックの文字を全部コピーして、エディタに貼り付けて、mac.patch というファイル名で作成すれば良いのでした。

※ 注意)
最後が、
+fi
で終わっていますが、その後に改行が必要なようです。
(patchコマンドでエラーになったので)



3.パッチのあて方
mac.patchが作れたら、パッチをあてます。

% patch -p1 < mac.patch

というコマンドでいいのですが、そのためには、
mac.patch は osbookディレクトリに置きます。(osbook/devenv と同じディレクトリ)
カレントディレクトリも osbookに移動してコマンドを実行します。


4.その他のビルドに必要なパッケージのインストール
% brew install nasm dosfstools binutils

で、nasm、dosfstools、binutils のインストールをしますが、

# Intel Mac の場合
% export PATH=/usr/local/opt/binutils/bin:$PATH

だけだと、dosfstools の PATH が通っていないことがあります。
具体的には、
mkfs.fat コマンドで、

zsh: command not found: mkfs.fat

 のエラーが出ることがあります。

% brew doctor

すると分かるのですが、PATHを通すために

% echo 'export PATH="/usr/local/sbin:$PATH"' >> ~/.zshrc

するようにと、警告が出ていました。
言われた通り、.zshrc にPATHを書き込めば mkfs.fatコマンドも使えるようになります。

あるいは、dosfstools のPATHを指定してもいいです。

export PATH=/usr/local/opt/dosfstools/sbin:$PATH



以上を併せて、他のPATH設定も.zshrcに書き込んでおけばいいでしょう。 
ちなみに、.zshrcの内容はこうなりました。

export PATH=/usr/local/opt/llvm/bin:$PATH
export PATH=/usr/local/opt/binutils/bin:$PATH

export PATH="/usr/local/sbin:$PATH"

(.zshrcを書き換えたら、有効にするためにがターミナル再起動が必要。)


5.「2.2 EDK II でハローワールド」をビルドする
Conf/target.txt
は、edk2 ディレクトリ内にあります。


6.QEMU で実行

% $HOME/osbook/devenv/run_qemu.sh
% $HOME/edk2/Build/MikanLoaderX64/DEBUG_CLANGPDB/X64/Loader.efi

で QEMUが起動して、Hello画面が出ればOKです!
初めて見たときは感動〜😭

Hello

(QEMUのウィンドウをクリックすると、マウスが動かなくなります。
QEMU_release
マウスのリリース方法は、Macでは ctrl + option + g のキー同時押しです。)


上記スクリプトが実行しているのは、以下の通りになります。

% rm -f ./disk.img
 
% qemu-img create -f raw ./disk.img 200M
 
% mkfs.fat -n 'MIKAN OS' -s 2 -f 2 -R 32 -F 32 ./disk.img
 
% hdiutil attach -mountpoint ./mnt ./disk.img
 
% mkdir -p ./mnt/EFI/BOOT
 
% cp $HOME/edk2/Build/MikanLoaderX64/DEBUG_CLANGPDB/X64/Loader.efi ./mnt/EFI/BOOT/BOOTX64.EFI
 
% hdiutil detach ./mnt
 
% qemu-system-x86_64 -m 1G \
-drive if=pflash,format=raw,readonly,file=$HOME/osbook/devenv/OVMF_CODE.fd \
-drive if=pflash,format=raw,file=$HOME/osbook/devenv/OVMF_VARS.fd \
-drive if=ide,index=0,media=disk,format=raw,file=./disk.img \
-device nec-usb-xhci,id=xhci \
-device usb-mouse \
-device usb-kbd -monitor stdio
(Loader.efi を起動する場合)

このまま、一行ずつ実行しても同じ結果になります。

ちなみに、QEMUの実行コマンドは、
「第1章 1.4 エミュレータでのやり方」と同じでも起動します。

% qemu-system-x86_64 \
-drive if=pflash,file=$HOME/osbook/devenv/OVMF_CODE.fd \
-drive if=pflash,file=$HOME/osbook/devenv/OVMF_VARS.fd \
-hda disk.img


結局、「第1章 1.4 エミュレータでのやり方」
と Macで違うのは、

・mount / unmount が hdiutil attach / detach になる

・QEMUの起動オプションが少し変わる

ことになります。


ちなみに、第1章で使うバイナリエディタは、Mac用のApp Storeから入手できる
hex fiend 
を使いました。


ゼロからのOS自作入門
内田公太
マイナビ出版
2021-03-22