きっかけ
ある時、論理班,OSソフト班班長である私は思いました。
せっかくならOS作りたいなー
OS開発では、標準の C ライブラリ(stdio.h など)をそのまま使えないため、専用の開発環境が必要になります。
そこで必要になるのが、まさに今構築しようとしている EDK2 です。
ただ、手元にあるのは macOS と学校支給の Chromebook だけ。
まずは macOS 上で EDK2 の環境構築に挑戦したのですが、参考書の手順どおりに進めてもエラーばかりが出てしまい、OS 開発初心者の自分には解決が難しく、途中で挫折してしまいました...
(多分アーキテクチャ互換性とかの問題)
なので
もしかしたらchromeOSでは成功するかも
ってことでchromeOSにEDK2をクローンしていきたいと思います。
もしEDK2が成功したらそのままqemuとかも入れたりして動かす予定です。
スペック
PC
ASUS CR1100FKA/CB1100FKA
CPU Intel Celeron N4500 @ 1.10GHz(スレッド数 2、2.800 GHz)
4GB メモリ
64GB SSD
はたしてこのスペックでOS開発できるのだろうか...
OS
バージョン 138.0.7204.232(Official Build)
64 ビット
準備(linux導入)
linuxを導入します。
もうlinux環境がインストールされているなら読み飛ばしてください
アプリ>設定>ChromeOSについてに移動します。
一番下のデベロッパーという項目の下にあるlinux 開発環境の右の設定をクリックします。

クリックすると以下のような画面が出てきます。
名前を入力してインストールをクリックしてください。

エラーが発生した場合再読み込みを押してやり直してください
それでも改善しなかったらPCを再起動したり他の人の記事を参考にするといいかもしれません。
EDK2環境構築
これで準備は整ったのでいよいよEDK2を入れていきたいと思います。
Terminalを起動します。
以下のコマンドを入力して必要なツールをインストールしてください。
sudo apt update
sudo apt install -y build-essential uuid-dev iasl git python3-distutils nasm
sudo apt install -y gcc g++ python3 python-is-python3
Do you want to continue? [Y/n] で処理が止まるのを避けるために-yをつけています。
次にEDK2本体をクローンします
git clone https://github.com/tianocore/edk2.git
cd edk2
git submodule update --init
最後にビルドします
make -C BaseTools
. edksetup.sh
echo ". $HOME/edk2/edksetup.sh" >> ~/.bashrc
しばらくして...
Ran 304 tests in 5.402s
OK
make[1]: Leaving directory '/home/yamatya/edk2/BaseTools/Tests'
make: Leaving directory '/home/yamatya/edk2/BaseTools'
WORKSPACE: /home/yamatya/edk2
EDK_TOOLS_PATH: /home/yamatya/edk2/BaseTools
CONF_PATH: /home/yamatya/edk2/Conf
Copying $EDK_TOOLS_PATH/Conf/build_rule.template
to /home/yamatya/edk2/Conf/build_rule.txt
Copying $EDK_TOOLS_PATH/Conf/tools_def.template
to /home/yamatya/edk2/Conf/tools_def.txt
Copying $EDK_TOOLS_PATH/Conf/target.template
to /home/yamatya/edk2/Conf/target.txt
こう表示されたら成功です!!
これでEDK2のビルドは終わりました!!
テストしてみましょう
テストコードをビルドするコマンド⇓
build -a X64 -t GCC5 -p MdeModulePkg/MdeModulePkg.dsc -m MdeModulePkg/Application/HelloWorld/HelloWorld.inf
成功するとBuild/MdeModule/DEBUG_GCC5/X64
にHelloWorld.efiが生成されます。
うまくいきました!!
次はそれを実行するためqemuというエミュレータを入れます。
QEMU環境構築
ということで早速qemuをインストールします
sudo apt install -y qemu-system-x86 qemu-utils
しかし今のqemuはLegacyBIOSというタイプのBIOSでEFIを起動することができません。
EFIを起動できるようにするためUEFI ファームウェア(OVMF)というものを使えるようにする必要があります。
ということでOVMF(UEFI)をインストールします。
sudo apt install -y ovmf
OVMFを使えるようにするためにOVMFのパスを見つける必要があります。
以下のコマンドを実行するとOVMF一覧が出てきます。
dpkg -L ovmf | grep fd
yamatya@penguin:~$ dpkg -L ovmf | grep fd
/usr/share/OVMF/OVMF_CODE.fd
/usr/share/OVMF/OVMF_CODE.secboot.fd
/usr/share/OVMF/OVMF_CODE_4M.fd
/usr/share/OVMF/OVMF_CODE_4M.secboot.fd
/usr/share/OVMF/OVMF_VARS.fd
/usr/share/OVMF/OVMF_VARS.ms.fd
/usr/share/OVMF/OVMF_VARS_4M.fd
/usr/share/OVMF/OVMF_VARS_4M.ms.fd
/usr/share/OVMF/OVMF_VARS_4M.snakeoil.fd
/usr/share/ovmf/OVMF.fd
/usr/share/OVMF/OVMF_CODE.ms.fd
/usr/share/OVMF/OVMF_CODE_4M.ms.fd
/usr/share/OVMF/OVMF_CODE_4M.snakeoil.fd
/usr/share/qemu/OVMF.fd
今回は/usr/share/OVMF/OVMF_CODE.fd(標準)を使います。
他にも
qemu-system-x86_64 -bios /usr/share/OVMF/OVMF_CODE.fd
これでUEFI環境も整ったので、実際に起動してみましょう。
起動
まず新しくフォルダを作って名前をEFIにしてください。
次にEFIフォルダ内にもう一回フォルダを作りBOOTという名前にしてください。
最後に、そのBOOTの中にHelloWorld.efiを移動させ、ファイル名をBOOTX64.efiにしてください。
拡張子の大文字・小文字は問いません
しかしコマンドでは大文字小文字区別します。
私の場合以下のような構造になりました。
EFI/
└BOOT/
└ BOOTX64.efi
UEFIはEFI/BOOTにあるBOOTX64.efiを自動で起動するようになっています。
さっき作ったEFI/BOOT...をFATイメージにフォーマットします。
rm -rf fimg
rm -f fat.img
sudo /sbin/mkfs.vfat -C fat.img 1440
sudo chown $USER:$USER fat.img
mcopy -i fat.img -s EFI ::/
(mtools がない場合)
sudo apt install genisoimage dosfstools mtools
するとfat.imgというイメージファイルが生成されるはずです。
mdir -i fat.img ::EFI/BOOT
でimgの構造を確認できます。
次に、 /usr/share/OVMF/は書き込みができないので以下のコマンドを実行します。
cp /usr/share/OVMF/OVMF_VARS.fd ~/OVMF_VARS.fd
そうすることでhomeにOVMF_VARS.fdがコピーされ書き込めるようになります。
準備ができたら以下のコマンドでqemu(UEFI)を起動させます。
qemu-system-x86_64 \
-machine q35 \
-drive if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive if=pflash,format=raw,file=OVMF_VARS.fd \
-drive file=fat.img,format=raw \
-m 512M
コマンドの意味
qemu-system-x86_64 \
-machine q35 (Intel Q35 チップセットを使う) \
-drive fdを指定\
-drive fdを指定 \
-drive file=ファイル名,format=raw \
-m RAMは512MB
UEFIは本体(CODE)と設定(VARS)を明確に分かれているので、2つのfdを指定する必要があります。
fd指定について詳しく
fd指定のファーマットについて
- if=pflash
pflash = “Platform Flash”
実機の BIOS ROM に相当する領域。
- format=raw
ファイルそのままを使う(qcow2 ではない)。
- readonly=on
UEFI のコード部分は書き換え禁止にする。
実機のBIOS ROMも書き換え禁止と同じ。
- file=OVMF_CODE.fd
UEFI の本体(コード)が入っているファイル。
ということで起動!!
おぉ!! 7行目らへんに注目!!
ちゃんと hello world ってでてる!!
終わりに
今回はChromeOS上にOS開発環境を整えてみました。
macでも成功できるように頑張ります!!
最後までお読みいただき、ありがとうございました。







