1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

きっかけ

ある時、論理班,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 開発環境の右の設定をクリックします。
image.png

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

そのまま数分~十数分待ちます。
videoframe_145000.png

エラーが発生した場合再読み込みを押してやり直してください
それでも改善しなかったらPCを再起動したり他の人の記事を参考にするといいかもしれません。

image.png

成功すると以下のように自動でTerminalが起動します
image.png

EDK2環境構築

これで準備は整ったのでいよいよEDK2を入れていきたいと思います。

Terminalを起動します。
以下のコマンドを入力して必要なツールをインストールしてください。

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

実行するとこんな感じの画面になってると思います。
image.png

Do you want to continue? [Y/n] で処理が止まるのを避けるために-yをつけています。


次にEDK2本体をクローンします

Terminal
git clone https://github.com/tianocore/edk2.git
cd edk2
git submodule update --init

実行中の画面
image.png


最後にビルドします

Terminal
make -C BaseTools
. edksetup.sh
echo ". $HOME/edk2/edksetup.sh" >> ~/.bashrc

しばらくして...

Terminal
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のビルドは終わりました!!
テストしてみましょう

テストコードをビルドするコマンド⇓

Terminal
build -a X64 -t GCC5 -p MdeModulePkg/MdeModulePkg.dsc -m MdeModulePkg/Application/HelloWorld/HelloWorld.inf

成功するとBuild/MdeModule/DEBUG_GCC5/X64
HelloWorld.efiが生成されます。

image.png

うまくいきました!!
次はそれを実行するためqemuというエミュレータを入れます。

QEMU環境構築

ということで早速qemuをインストールします

Terminal
sudo apt install -y qemu-system-x86 qemu-utils

しかし今のqemuはLegacyBIOSというタイプのBIOSでEFIを起動することができません。

EFIを起動できるようにするためUEFI ファームウェア(OVMF)というものを使えるようにする必要があります。

ということでOVMF(UEFI)をインストールします。

Terminal
sudo apt install -y ovmf

OVMFを使えるようにするためにOVMFのパスを見つける必要があります。
以下のコマンドを実行するとOVMF一覧が出てきます。

Terminal
dpkg -L ovmf | grep fd
out
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(標準)を使います。

他にも

Terminal
qemu-system-x86_64 -bios /usr/share/OVMF/OVMF_CODE.fd

このコマンドでUEFIシェルを立ち上げることができます
image.png


これでUEFI環境も整ったので、実際に起動してみましょう。

起動

まず新しくフォルダを作って名前をEFIにしてください。
次にEFIフォルダ内にもう一回フォルダを作りBOOTという名前にしてください。
最後に、そのBOOTの中にHelloWorld.efiを移動させ、ファイル名をBOOTX64.efiにしてください。

拡張子の大文字・小文字は問いません

しかしコマンドでは大文字小文字区別します。

私の場合以下のような構造になりました。

EFI/
    └BOOT/
        └ BOOTX64.efi

UEFIはEFI/BOOTにあるBOOTX64.efiを自動で起動するようになっています。


さっき作ったEFI/BOOT...をFATイメージにフォーマットします。

Terminal
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 がない場合)

Terminal
sudo apt install genisoimage dosfstools mtools

するとfat.imgというイメージファイルが生成されるはずです。

mdir -i fat.img ::EFI/BOOT

でimgの構造を確認できます。


次に、 /usr/share/OVMF/は書き込みができないので以下のコマンドを実行します。

Terminal
cp /usr/share/OVMF/OVMF_VARS.fd ~/OVMF_VARS.fd

そうすることでhomeにOVMF_VARS.fdがコピーされ書き込めるようになります。


準備ができたら以下のコマンドでqemu(UEFI)を起動させます。

Terminal
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

コマンドの意味

Terminal-JP
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 の本体(コード)が入っているファイル。


ということで起動!!

image.png

おぉ!! 7行目らへんに注目!!
ちゃんと hello world ってでてる!!

終わりに

今回はChromeOS上にOS開発環境を整えてみました。
macでも成功できるように頑張ります!!

最後までお読みいただき、ありがとうございました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?