ARM UEFI

ARM UEFI

# 環境構築

  1. ssh で amaneに入る
  2. defファイル作成
  • arm cross compile環境を作成
  • edk2は /usr/local/src にinstallされている
  • gnu-efiがdownloadにダウンロードされ解凍される
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
  1. sifファイルを生成(https://ie.u-ryukyu.ac.jp/syskan/opening-introduction/singularity.html#10)\
  • singularity build --fakeroot xv6.sif xv6.def
  1. singularity 起動
  • singularity run xv6.sif
  1. 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が生成される
  1. gnu-efiをbuild
  • cd gnu-efi-(version)で移動
  • make CROSS_COMPILE=arm-linux-gnueabihf-でクロスコンパイラでbuild
  1. gnu-efi applicationをbuild
  • make CROSS_COMPILE=arm-linux-gnueabihf- apps\
    • appsにあるapplicationをbuildする\
    • buildされたapplicationはarm/appsにあり、.efiになっている
  1. 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
  • shellにfs0:と入力
    • appsがあるデバイスに移動できる
  • shellにt.efi と入力
    • Hello Worldが帰ってくる
    • t.efiHello Worldのサンプルプログラム
  • qemuを抜けられないバグがあり、他のエディタでkillallして抜ける

# Application 実装

  1. apps内にC言語でコードを書く(例としてHello.c)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#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_
  1. apps内にあるMakefileを修正する
  • TARGET_APPS にHello.efiを追加
  1. gnu-efi applicationをbuild
  • make CROSS_COMPILE=arm-linux-gnueabihf- apps
  • arm/appsの中にHello.efiがあれば成功
  1. 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を入力
1
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 ネットに繋がない様にしている(これで起動が速くなる)

# 参考

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy