view Gears/Xv6/UEFI.md @ 45:1db60e3a946d

backup 2021-02-20
author autobackup
date Sat, 20 Feb 2021 00:10:03 +0900
parents
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
-