FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

AArch64版QEMUとUbuntuを使用してARM版Linuxを立ち上げる

ここでやりたいことは、これまで作って生きているRust版RISC-VエミュレータARMアーキテクチャ上で動かすということだ。現在の私のRISC-Vエミュレータは変換後の機械語X86限定になっているため、ARM上では動かないのは至極当たり前のことだ。そこで、ARMの機械語にも対応させることでより汎用なシミュレーションプラットフォームとして構築することを考えていきたい。

本当はRaspberry-Piを使っても良いと思ったのだが、手元にあるRaspberry-Pi3に刺さっていたMicroSDカードがなぜか認識せずUbuntuを書き込めないので、とりあえずQEMUを使って、X86ホストマシン上にARM版のUbuntuを立ち上げることを目標とした。

参考にしたのは以下のサイト。というか、以下のサイトをトレースすることでほとんど問題なくUbuntuQEMUで立ち上げることに成功した。すごい。

zenn.dev

$ wget http://ubuntutym2.u-toyama.ac.jp/cloud-images/releases/18.04/bionic-server-cloudimg-arm64.img
$ wget https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd

EFIというものがなんなのか良く分かっていない。

$ dd if=/dev/zero of=flash0.img bs=1M count=64
$ dd if=QEMU_EFI.fd of=flash0.img conv=notrunc
$ dd if=/dev/zero of=flash1.img bs=1M count=64

cloud-image-utilsというのは何だろう?クラウドでディスクを汎用的に使うためのツールだろうか?

$ sudo apt install cloud-image-utils

以下の設定ファイルもそのまま使用できた。ユーザ名だけ書き換えた。

$ cat >cloud.txt <<EOF
> #cloud-config
> user: msyksphinz
> password: [Password]
> chpasswd: { expire: False }
> ssh_pwauth: True
> EOF
$ cloud-localds --disk-format qcow2 cloud.img cloud.txt

順番は逆転するが、Rustのツール群をインストールするためにディスク容量は大きくしておいた。

$ ~/work/riscv/qemu/build/qemu-img resize bionic-server-cloudimg-arm64.img

起動方法は以下:

$ qemu-system-aarch64 -m 4096 -smp 4 -cpu cortex-a57 -M virt -nographic \
  -pflash flash0.img \
  -pflash flash1.img \
  -drive if=none,file=ubuntu-18.04-server-cloudimg-arm64.img,id=hd0 \
  -device virtio-blk-device,drive=hd0 \
  -drive if=none,id=cloud,file=cloud.img \
  -device virtio-blk-device,drive=cloud \
  -device virtio-net-device,netdev=user0 \
  -netdev user,id=user0,hostfwd=tcp::2222-:22

Rustのツールは以下のようにしてセットアップする。

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

AArch64の環境でもこれで一応Rustコンパイラの環境が立ち上がった。すごいなあ。

Rustのプロジェクトをダウンロードしてビルドしてみる。

$ git clone https://github.com/msyksphinz-self/dydra.git
$ cd dydra
$ cargo build

ふむ、以下で落ちてしまった。やはりsoftfloatを扱うのは大変だなあ...

error: failed to run custom build command for `softfloat-sys v0.1.3`

Caused by:
  process didn't exit successfully: `/home/msyksphinz/work/dydra/target/debug/build/softfloat-sys-9ae65ee485d9fbe4/build-script-build` (exit code: 101)
  --- stdout
  OPT_LEVEL = Some("0")
  TARGET = Some("aarch64-unknown-linux-gnu")
  HOST = Some("aarch64-unknown-linux-gnu")
  CC_aarch64-unknown-linux-gnu = None
  CC_aarch64_unknown_linux_gnu = None
  HOST_CC = None
  CC = None
  CFLAGS_aarch64-unknown-linux-gnu = None
  CFLAGS_aarch64_unknown_linux_gnu = None
  HOST_CFLAGS = None
  CFLAGS = None
  CRATE_CC_NO_DEFAULTS = None
  DEBUG = Some("true")
  CARGO_CFG_TARGET_FEATURE = Some("fp,neon")

  --- stderr
  thread 'main' panicked at 'not implemented: build rules are not implemented for the current target_arch and target_os', /home/msyksphinz/.cargo/registry/src/github.com-1ecc6299db9ec823/softfloat-sys-0.1.3/build.rs:373:9
  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace