# HG changeset patch # User autobackup # Date 1613747403 -32400 # Node ID 1db60e3a946d0e6aa8c26f67d8738ec9be4e5576 # Parent de92cac72df888980af234e3d9a11b4c939654b6 backup 2021-02-20 diff -r de92cac72df8 -r 1db60e3a946d Gears/Xv6/UEFI.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/Xv6/UEFI.md Sat Feb 20 00:10:03 2021 +0900 @@ -0,0 +1,147 @@ +# ARM UEFI + +## 環境構築 +1. ssh で amaneに入る +1. defファイル作成 +- arm cross compile環境を作成 +- edk2は ```/usr/local/src``` にinstallされている +- gnu-efiがdownloadにダウンロードされ解凍される +``` +BootStrap: docker +From: ubuntu:18.04 + +%post + apt-get update + apt-get upgrade -y + DEBIAN_FRONTEND=noninteractive \ + apt-get install -y \ + qemu-utils \ + qemu-efi-aarch64 \ + qemu-system-arm \ + build-essential \ + uuid-dev \ + git \ + python \ + iasl \ + nasm \ + zsh \ + vim \ + wget + DEBIAN_FRONTEND=noninteractive \ + apt-get install -y \ + crossbuild-essential-armhf + cd /usr/local/src + git clone --recursive https://github.com/tianocore/edk2 + wget "https://sourceforge.net/projects/gnu-efi/files/gnu-efi-3.0.12.tar.bz2/download" + tar xf download +``` + +3. sifファイルを生成(https://ie.u-ryukyu.ac.jp/syskan/opening-introduction/singularity.html#10)\ +- ```singularity build --fakeroot xv6.sif xv6.def``` + +4. singularity 起動 +- ```singularity run xv6.sif ``` + +5. singularity上でedk2からQEMU_EFI.fdを作成する +- ```cd edk2```でedk2に移動し +- ```make -C BaseTools```でBaseToolsをbuildする +- ```source edksetup.sh ``` +- ```export GCC5_ARM_PREFIX=arm-linux-gnueabihf-```で環境設定 +- ```build -a ARM -t GCC5 -p ArmVirtPkg/ArmVirtQemu.dsc```でQEMU用のUEFIイメージをビルド + - ```QEMU_EFI.fd```が生成される + +6. gnu-efiをbuild +- ```cd gnu-efi-(version)```で移動 +- ```make CROSS_COMPILE=arm-linux-gnueabihf-```でクロスコンパイラでbuild + +7. gnu-efi applicationをbuild +- ```make CROSS_COMPILE=arm-linux-gnueabihf- apps```\ + - appsにあるapplicationをbuildする\ + - buildされたapplicationはarm/appsにあり、```.efi```になっている +8. QEMUで起動 +- ```qemu-system-arm -m 128 -M virt -bios ./QEMU_EFI.fd -serial stdio -hda fat:rw:arm/apps -curses -net none``` +- qemuを起動後shellが起動する![スクリーンショット 2021-02-19 17.49.27.png](/attachment/602f7ba70a7b37004aefa065) +- shellに```fs0:```と入力 + - appsがあるデバイスに移動できる +- shellに```t.efi``` と入力 + - ```Hello World```が帰ってくる + - ```t.efi```は```Hello World```のサンプルプログラム +- qemuを抜けられないバグがあり、他のエディタで```killall```して抜ける + + +## Application 実装 + +1. apps内にC言語でコードを書く(例としてHello.c) +``` +#include +#include + +EFI_STATUS +EFIAPI +efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) +{ + InitializeLib(ImageHandle, SystemTable); + Print(L"Hello, world!\n"); + return EFI_ +``` +2. apps内にあるMakefileを修正する +- TARGET_APPS にHello.efiを追加 + +3. gnu-efi applicationをbuild +- ```make CROSS_COMPILE=arm-linux-gnueabihf- apps``` +- arm/appsの中に```Hello.efi```があれば成功 + +4. qemuで起動し、動かす +- ```qemu-system-arm -m 128 -M virt -bios ./QEMU_EFI.fd -serial stdio -hda fat:rw:arm/apps -curses -net none``` +- shellに```fs0:```と入力 +- Hello.efiを入力 +``` +Hello, world! +``` +## QEMUコマンド +- ```qemu-system-arm``` armのエミュレータ +- ```-m 128 ``` メモリを128Mb +- ```-M virt ```Virtプラットフォーム +- ```-bios ./QEMU_EFI.fd ``` biosにQEMU_EFI.fdを起動する +- ```-serial stdio ``` これがないと映らない(多分ディスプレイ関係) +- ```-hda fat:rw:arm/apps``` ディスクとしてarm/apps を用意している +- ```-curses``` これがないとsingularity上でqemuが使えない +- ```-net none``` ネットに繋がない様にしている(これで起動が速くなる) + + +## 参考 + +- https://tnishinaga.hatenablog.com/entry/2017/06/20/191955 +- https://tnishinaga.hatenablog.com/entry/2017/03/17/035732 +- https://wiki.osdev.org/UEFI +- https://osdev-jp.readthedocs.io/ja/latest/2017/create-uefi-app-with-edk2.html +- + + + + + + + + + + + + + + + + + + + + + + + + + + + + +