kaz399; AArch64向けの環境構築手順 - uchan-nos/os-from-zero GitHub Wiki

MikanOSのターゲットはx86_64ですが、これをなんとかAArch64(QEMU)で動かしてみたいと考えています。

別のアーキテクチャへ移植する時に注意しないといけないのは、ハードウェアの初期化などのシステムの起動直後の初期設定をどうするかです。

でもMikanOSはUEFIから起動する現代のOSなので、そのへんはUEFIに任せることができるはずです。

実はUEFIがどこまでシステムの初期化するのかは正直なところ不勉強のためよくわかっていません。しかしきっとシステム初期化あたりは割とイイ感じにやってくれると信じて、軽い気持ちで挑戦してみます。

AArch64対応作業はざっくり下記を想定します。

環境構築

  • クロスコンパイル環境構築
  • AArch64用EDK2のビルド

移植

  • LoaderのAArch64対応
  • 割り込みのAArch64対応
  • ページテーブルのAArch64対応

というわけで、とりあえず環境構築から始めます。

環境構築

開発環境はWindows10 WSL2(Ubuntu 20.04)上に構築します。

構築手順をまとめたものをこのリポジトリに置きました。リポジトリをクローンしてからaarch64-buildenv/buildenv.shを実行 することでクロスコンパイル環境をまとめて構築します。

環境構築スクリプトの実行は、README.mdに従い作業ディレクトリを作成したうえで行ってくださ い。

環境構築の解説

クロスコンパイラの入手

なにはともあれAArch64のバイナリを出せるコンパイラを入手します。

コンパイラはgccクロスコンパイラとclangを用意します。使い分けは下記です。

  • gcc:ライブラリをコンパイルするために使用
  • clang:EDK2とMikanOSをコンパイルするために使用

2種類用意するのは無駄な気がしますが、ライブラリをconfigureでクロスコンパイルするときにはgccのほうが楽です。一方、MikanOSはlibc++の使用が前提になっています。gcc に付いてくるlibstdc++を使おうとすると細かい修正が必要になるので、こちらはclangを使います。EDK2はgcc, clangどちらでもコンパイルできますが、オリジナルのMikanOS環 境構築手順でclangを使っているので合わせます。

gccはAArch64 GNU/Linux target (aarch64-none-linux-gnu)を使います。

clangはclang-11 Pre-Build binary (ubuntu 20.04)を使います。

ライブラリの準備

MikanOSで使う標準ライブラリを見ると、必要なものは以下です。

  • Newlib
  • libc++
  • FreeType

まずこれらのAArch64版をなんとかするところから始めます。

Newlib

クロスコンパイルするとエラーが出ました。Newlibでなくとも要はC標準ライブラリがあればいいのだろうということで、Newlibは速攻であきらめてクロスコンパイルしやすいmusl libcを使います。

クロスコンパイルには先ほどのgccを使います。下記の手順でビルドします。

./configure --target=aarch64-linux-gnu --disable-shared
make

libc++

AArch64向けClangのバイナリに同梱されているので、これをダウンロードして使います。自力でのビルドは行いません。

FreeType

自力でクロスコンパイルします。 まずリポジトリをクローンしてきます。

git clone https://github.com/freetype/freetype2.git

下記の手順でビルドします。

./autogen.sh
./configure --target=aarch64-linux-gnu --disable-shared
make

EDK2のビルド

リポジトリをクローンしてきます。

git clone https://github.com/tianocore/edk2.git

下記の手順でビルドします。

git submodule init
git submodule update
cd BaseTools
make
cd ../
. edksetup.sh
export CLANG38_AARCH64_PREFIX=aarch64-linux-gnu-
build -a AARCH64 -t CLANG38 -p ArmVirtPkg/ArmVirtQemu.dsc

Build/ArmVirtQemu-AARCH64/DEBUG_CLANG38/FV/QEMU_EFI.fdQEMU_VARS.fdが作成されます。

OVMF_CODE.fd と OFMF_VARS.fdの作成

上記のファイルをQEMUで扱うためには、サイズを64MiBに調整する必要があります。そのまま使おうとするとQEMUに怒られて使えません。

ddコマンドを使ってサイズを64MiBに合わせます。

dd if=/dev/zero of=OVMF_CODE.fd bs=1M count=64
dd if=Build/ArmVirtQemu-AARCH64/DEBUG_CLANG38/FV/QEMU_EFI.fd of=OVMF_CODE.fd conv=notrunc

dd if=/dev/zero of=OVMF_VARS.fd bs=1M count=64
dd if=Build/ArmVirtQemu-AARCH64/DEBUG_CLANG38/FV/QEMU_VARS.fd of=OVMF_VARS.fd conv=notrunc

これでとりあえず環境構築が終わりました。