ここでやりたいことは、これまで作って生きているRust版RISC-VエミュレータをARMアーキテクチャ上で動かすということだ。現在の私のRISC-Vエミュレータは変換後の機械語がX86限定になっているため、ARM上では動かないのは至極当たり前のことだ。そこで、ARMの機械語にも対応させることでより汎用なシミュレーションプラットフォームとして構築することを考えていきたい。
本当はRaspberry-Piを使っても良いと思ったのだが、手元にあるRaspberry-Pi3に刺さっていたMicroSDカードがなぜか認識せずUbuntuを書き込めないので、とりあえずQEMUを使って、X86ホストマシン上にARM版のUbuntuを立ち上げることを目標とした。
参考にしたのは以下のサイト。というか、以下のサイトをトレースすることでほとんど問題なくUbuntuをQEMUで立ち上げることに成功した。すごい。
$ 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