Mercurial > hg > Document > Growi
view Gears/Xv6/UEFI.md @ 93:04cff9568106
backup 2021-10-05
author | autobackup |
---|---|
date | Tue, 05 Oct 2021 00:10:04 +0900 |
parents | 1db60e3a946d |
children |
line wrap: on
line source
# 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 <efi.h> #include <efilib.h> 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 -