「ゼロからのOS自作入門」 00日目

試行錯誤メモ

(20210325 追記) この記事も詳しく書いてらっしゃいますね。なるほど。参考になります…!


待ちに待った自作 OS 本が出版されました。やったー。

ゼロからのOS自作入門 | 内田 公太 |本 | 通販 | Amazon

そして、ものぐさな私は操作マシンの切り替えがめんどくさいので(?)、 手持ちの Apple Silicon 環境でどうにか学習が進められないかどうかを検討するのでありました。


※ お決まりの前置き ※

作者様の想定する環境は x86_64 の win / Lin で、他環境は未検証とのことなので、困る質問はせずに自分自身で研究する強い心が大事です。 素直にオススメ環境で学習進めたほうが遥かに楽だと思います(…が、試行錯誤するほうが私は面白いと思います!)

以下掲載する手順は、おそらく他の M1 Mac でも通用すると思いますが、素人ゆえに色々間違えてるかもしれないので、もし間違いがありましたらそっと教えて下さい。


Apple Silicon Mac で x86_64/QEMU をビルドして UEFI で Hello World するまで

大筋、下記の記事を参考にしています。大変勉強になりました。

Xcode / Command Line Tools をインストール

App Store で Xcode をインストールするか、または Command Line Tools を以下のコマンドでインストールする。

[a64]roca@mbp:$ xcode-select --install

Home brew で QEMU ビルド用のツールをインストール

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 のビルドがコケました。

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 のビルド

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

EFIの起動イメージを作る

いよいよ本題。

頑張ってバイナリエディタでプログラム(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

EFIイメージを起動する

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

キタ━━━━(゚∀゚)━━━━!!

boot

というわけで、x86_64/QEMU はうまく動くみたい。残るは各種クロスコンパイラだなぁ。多分それが一番鬼門…。

(続く…)

© 2021 czu.jp