(20210325 追記) この記事も詳しく書いてらっしゃいますね。なるほど。参考になります…!
待ちに待った自作 OS 本が出版されました。やったー。
ゼロからのOS自作入門 | 内田 公太 |本 | 通販 | Amazon
そして、ものぐさな私は操作マシンの切り替えがめんどくさいので(?)、 手持ちの Apple Silicon 環境でどうにか学習が進められないかどうかを検討するのでありました。
『ゼロからのOS自作入門』ポチったどー!うひょー。
— ろか (@rocasfero) March 22, 2021
とりあえず、メインの M1 Mac ちゃんで勉強できそうか試行錯誤してみよう(アーキテクチャ違ってもうまいことqemuとかクロスビルド環境を仕立てればなんとかなりそうな気がシマウマ)。
— ろか (@rocasfero) March 22, 2021
まぁ、ダメそうなら久々にx64実機ちゃんに火を入れてLinuxで始めてみようかな。
作者様の想定する環境は x86_64 の win / Lin で、他環境は未検証とのことなので、困る質問はせずに自分自身で研究する強い心が大事です。 素直にオススメ環境で学習進めたほうが遥かに楽だと思います(…が、試行錯誤するほうが私は面白いと思います!)
以下掲載する手順は、おそらく他の M1 Mac でも通用すると思いますが、素人ゆえに色々間違えてるかもしれないので、もし間違いがありましたらそっと教えて下さい。
大筋、下記の記事を参考にしています。大変勉強になりました。
App Store で Xcode をインストールするか、または Command Line Tools を以下のコマンドでインストールする。
[a64]roca@mbp:$ xcode-select --install
arm64 用の Home brew でないとビルドが通らないとのことなので、arm64 版のものをあらかじめインストールしておく。
現在の Home brew 3.0.0 の正式リリース以降は、arm64 ビルド版は /opt/homebrew
に配置され、x86_64 版は /usr/local
に配置される状態で、
私は以下の手順を若干参考のもと、arm64/x86_64 環境を切り替えられるようにしています。
具体的な Home brew のパスはそれぞれこんな感じ。シェル起動時にアーキテクチャを自動判別して内部的に通すパスを変更してます。 (プロンプトの先頭でアーキテクチャを区別できるようにしています)
# arm64環境
[a64]roca@mbp:$ which brew
/opt/homebrew/bin/brew
# x86_64環境(≒Rosetta)
[x64]roca@mbp:$ which brew
/usr/local/bin/brew
(以下、arm64 環境のターミナルで実行していきます)
[a64]roca@mbp:$ brew install ninja pkgconfig glib pixman libusb
libusb も arm64 版を入れないと QEMU のビルドがコケました。
[a64]roca@mbp:$ git clone https://git.qemu.org/git/qemu.git
[a64]roca@mbp:$ cd qemu
[a64]roca@mbp:(master)$ git checkout d0dddab40e -b wip/
# Hypervisor.framework 周りのパッチ: -accel hvf オプション
[a64]roca@mbp:(wip/hvf)$ curl 'https://patchew.org/QEMU/20210120224444.71840-1-agraf@csgraf.de/mbox' | git am -3
# Hypervisor.framework 周りのパッチ
[a64]roca@mbp:(wip/hvf)$ curl 'https://patchew.org/QEMU/20210123004129.6364-1-agraf@csgraf.de/mbox' | git am -3
# BigSur 11.2 で mprotect の問題でQEMUが動かなくなってしまう問題に対処するパッチ
[a64]roca@mbp:(wip/hvf)$ curl 'https://patchew.org/QEMU/161280769492.2878.8851519112088854609.malone@chaenomeles.canonical.com/mbox' | git am -3
# Cocoa周りのパッチ
[a64]roca@mbp:(wip/hvf)$ curl "https://patchew.org/QEMU/20210212000404.28413-1-akihiko.odaki@gmail.com/mbox" | git am -3
[a64]roca@mbp:(wip/hvf)$ curl "https://patchew.org/QEMU/20210212000540.28486-1-akihiko.odaki@gmail.com/mbox" | git am -3
[a64]roca@mbp:(wip/hvf)$ curl "https://patchew.org/QEMU/20210212000629.28551-1-akihiko.odaki@gmail.com/mbox" | git am -3
[a64]roca@mbp:(wip/hvf)$ curl "https://patchew.org/QEMU/20210212000706.28616-1-akihiko.odaki@gmail.com/mbox" | git am -3
QEMU をビルドする。先例にならってインストールパスは /opt/QEMU
にします。
とりあえず、x86_64 環境だけあればいい気がするので対応アーキテクチャを限定してみます。後々困ったら増やしてみます。
[a64]roca@mbp:(wip/hvf)$ mkdir build
[a64]roca@mbp:(wip/hvf)$ cd build
[a64]roca@mbp:(wip/hvf)$ ../configure --prefix=/opt/QEMU --target-list=x86_64-softmmu --enable-cocoa
[a64]roca@mbp:(wip/hvf)$ make -j
(…暫し待つ…)
[a64]roca@mbp:(wip/hvf)$ sudo make install
# あとはよろしくPATHなどを通す
[a64]roca@mbp:(wip/hvf)$ vim ~/.zshrc
export PATH="/opt/QEMU/bin/:$PATH"```
なんでこれが必要なのかがわかってないですけど、教えに沿ってやっておく。後で調べる。
[a64]roca@mbp:(wip/hvf)$ vim entitlements.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.hypervisor</key>
<true/>
</dict>
</plist>
[a64]roca@mbp:(wip/hvf)$ sudo codesign --entitlements entitlements.plist --force -s - /opt/QEMU/bin/qemu-system-x86_64
いよいよ本題。
頑張ってバイナリエディタでプログラム(BOOTX64.EFI)を作り、起動イメージを作成する。
fat ファイルシステム作成のために dosfstools コマンドをインストールして EFI イメージを作成する。 ちなみに、Mac の場合には mount コマンドではなくて hdiutil コマンドを使ってマウントするといいみたい。
[a64]roca@mbp:$ brew install dosfstools
[a64]roca@mbp:$ qemu-img create -f raw disk.img 200M
[a64]roca@mbp:$ mkfs.fat -n 'MIKAN OS' -s 2 -f 2 -R 32 -F 32 disk.img
[a64]roca@mbp:$ hdiutil attach disk.img
/dev/disk4 /Volumes/MIKAN OS
[a64]roca@mbp:$ mkdir -p /Volumes/MIKAN\ OS/EFI/BOOT
[a64]roca@mbp:$ cp BOOTX64.EFI /Volumes/MIKAN\ OS/EFI/BOOT/
[a64]roca@mbp:$ hdiutil detach /Volumes/MIKAN\ OS
UFEI モードで起動するためのオプションは各自で読み替えていただきまして。いざ、運命の瞬間…!
[a64]roca@mbp:$ qemu-system-x86_64 \
-drive if=pflash,file=$HOME/mikanos-build/devenv/OVMF_CODE.fd \
-drive if=pflash,file=$HOME/mikanos-build/devenv/OVMF_VARS.fd \
-hda disk.img
キタ━━━━(゚∀゚)━━━━!!
というわけで、x86_64/QEMU はうまく動くみたい。残るは各種クロスコンパイラだなぁ。多分それが一番鬼門…。
(続く…)