今回は、QEMU で Arm の組み込み Linux を動かしていきたいと思います。
これまで、STM32 を動かしていたのは、本家の QEMU ではなく、xPackプロジェクトの QEMU Arm でした。
今回は、Linux なので、本家の QEMU をインストールして、開発環境の構築と、簡単なものを動かしてみたいと思います。
それでは、やっていきます。
はじめに
「QEMUを動かす」の記事一覧です。良かったら参考にしてください。
QEMUを動かすの記事一覧
まず、QEMU のインストールからやっていきます。
環境は、VirtualBox の Ubuntu 22.04 です。
QEMU のインストール
本家 QEMU のサイトです。
www.qemu.org
DOWNLOAD に進みます。
QEMUのトップページ
Linux を選択すると、Ubuntu 用のインストール方法が書かれているので従います。
qemu-system が QEMU の本体です。
qemu-user-static は、ユーザモードの QEMU で、Arm のバイナリ(クロスコンパイルした Arm のプログラム、HelloWorld とか)を単体で動かすことが出来るというものです。今回は使わないですが、一応入れておきます。
DOWNLOADページ
$ sudo apt-get install qemu-system
$ sudo apt-get install qemu-user-static
無事にインストールできました。
試しに、qemu と入力して、タブを押してみると、いっぱい出ました。
$ qemu-
qemu-aarch64-static qemu-mipsel-static qemu-system-aarch64 qemu-system-ppc64le
qemu-aarch64_be-static qemu-mipsn32-static qemu-system-alpha qemu-system-riscv32
qemu-alpha-static qemu-mipsn32el-static qemu-system-arm qemu-system-riscv64
qemu-arm-static qemu-nbd qemu-system-avr qemu-system-rx
qemu-armeb-static qemu-nios2-static qemu-system-cris qemu-system-s390x
qemu-cris-static qemu-or1k-static qemu-system-gnuarmeclipse qemu-system-sh4
qemu-debootstrap qemu-ppc-static qemu-system-hppa qemu-system-sh4eb
qemu-hexagon-static qemu-ppc64-static qemu-system-i386 qemu-system-sparc
qemu-hppa-static qemu-ppc64le-static qemu-system-m68k qemu-system-sparc64
qemu-i386-static qemu-pr-helper qemu-system-microblaze qemu-system-tricore
qemu-img qemu-riscv32-static qemu-system-microblazeel qemu-system-x86_64
qemu-io qemu-riscv64-static qemu-system-mips qemu-system-x86_64-microvm
qemu-m68k-static qemu-s390x-static qemu-system-mips64 qemu-system-x86_64-spice
qemu-make-debian-root qemu-sh4-static qemu-system-mips64el qemu-system-xtensa
qemu-microblaze-static qemu-sh4eb-static qemu-system-mipsel qemu-system-xtensaeb
qemu-microblazeel-static qemu-sparc-static qemu-system-nios2 qemu-x86_64-static
qemu-mips-static qemu-sparc32plus-static qemu-system-or1k qemu-xtensa-static
qemu-mips64-static qemu-sparc64-static qemu-system-ppc qemu-xtensaeb-static
qemu-mips64el-static qemu-storage-daemon qemu-system-ppc64
今回のターゲットは、qemu-system-arm なので、バージョンを調べます。
$ qemu-system-arm -version
xPack QEMU emulator version 8.2.2 (v8.2.2-xpack)
Copyright (c) 2003-2023 Fabrice Bellard and the QEMU Project developers
v8.2.2 でした。これでインストールは完了です。
QEMUで組み込みLinuxを下調べする
本家 QEMU のドキュメントページです。
www.qemu.org
対応してる machine を調べてみます。たくさん出ますが、興味があるものだけ貼っておきます。
$ qemu-system-arm -machine help
Supported machines are:
mcimx6ul-evk Freescale i.MX6UL Evaluation Kit (Cortex-A7)
mcimx7d-sabre Freescale i.MX7 DUAL SABRE (Cortex-A7)
raspi0 Raspberry Pi Zero (revision 1.2)
raspi1ap Raspberry Pi A+ (revision 1.1)
raspi2b Raspberry Pi 2B (revision 1.1)
vexpress-a15 ARM Versatile Express for Cortex-A15
vexpress-a9 ARM Versatile Express for Cortex-A9
virt QEMU 8.2 ARM Virtual Machine (alias of virt-8.2)
virt-8.2 QEMU 8.2 ARM Virtual Machine
ここからどう進めようかと、いろいろ検索して探してみると、はてなブログの方で、BuildRoot と BusyBox で、QEMU を起動されてる方がいたので、こちらを参考にさせて頂きます。
leavatail.hatenablog.com
では、今回は、vexpress-a9 をターゲットにしたいと思います。
QEMU のドキュメントの vexpress-a9 のページのリンクも貼っておきます。
qemu-project.gitlab.io
ChatGPT の vexpress-a9 の解説です。
vexpress-a9 は、ARM社が提供する Versatile Express(V2P-CA9)開発ボードの一つで、Cortex-A9 プロセッサを搭載しています。このボードは、SoC(System on Chip)の設計やソフトウェア開発、システム検証などのためのプラットフォームとして広く使用されています。
Buildrootのダウンロードとビルドと起動
Buildroot の公式サイトです。
buildroot.org
Buildrootのドキュメント
上のメニューの Document は、Buildroot のドキュメントページです。少し見てみます。
- Buildroot とは、クロスコンパイルを使用して組み込みシステム用の完全な Linux システムを構築するプロセスを簡素化、および、自動化するツール
- root ではなく、通常のユーザで実行すべき
- make の並列実行はサポートしていないので、j オプションは不要(実験的なサポートあり)
- Buildroot の出力は、単一のディレクトリ output に保存される
Buildrootのダウンロード
ダウンロードページに進みます。
Buildrootのダウンロードページ
あまり分かってませんが、安全そうな long term support の tar.gz にしようと思います。
$ wget https://buildroot.org/downloads/buildroot-2024.02.3.tar.gz
$ wget https://buildroot.org/downloads/buildroot-2024.02.3.tar.gz.sign
$ sha256sum buildroot-2024.02.3.tar.gz
ece7844cb9485422705c2b7f3dc07521fd2fbd1a612e835d204b200234103ca3 buildroot-2024.02.3.tar.gz
$ cat buildroot-2024.02.3.tar.gz.sign
SHA256: ece7844cb9485422705c2b7f3dc07521fd2fbd1a612e835d204b200234103ca3 buildroot-2024.02.3.tar.gz
$ tar zxvf buildroot-2024.02.3.tar.gz
$ cd buildroot-2024.02.3/
$ find . -name '*vexpress*'
./configs/qemu_arm_vexpress_tz_defconfig
./configs/qemu_arm_vexpress_defconfig
./board/qemu/arm-vexpress
./board/qemu/arm-vexpress-tz
./boot/vexpress-firmware
./boot/vexpress-firmware/vexpress-firmware.mk
./boot/vexpress-firmware/vexpress-firmware.hash
Buildrootのビルド
Arm Linux 用のクロスコンパイラをインストールするのを忘れてました。
$ sudo apt install gcc-arm-linux-gnueabi
まず、.config を作ります。検索で見つかった qemu_arm_vexpress_defconfig を使います。
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- qemu_arm_vexpress_defconfig
ログを見たところ、"/usr/bin/gcc" が使われていたので、ARCH と CROSS_COMPILE の環境変数の設定はいらなかったようです。
今回は最小構成にしようと思うので、早速カーネルをビルドします。
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
だいぶかかりました。約1時間ぐらいでしょうか。
Buildrootの起動
QEMU の場合は、起動するためのスクリプト「output/images/start-qemu.sh」が作られています。
これを実行するだけで起動できるのか試してみます。
$ output/images/start-qemu.sh
VNC server running on 127.0.0.1:5900
Booting Linux on physical CPU 0x0
Linux version 6.1.44 (daisuke@daisuke-VirtualBox) (arm-buildroot-linux-gnueabihf-gcc.br_real (Buildroot 2024.02.3) 12.3.0, GNU ld (GNU Binutils) 2.40)
CPU: ARMv7 Processor [410fc090] revision 0 (ARMv7), cr=10c5387d
CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
OF: fdt: Machine model: V2P-CA9
Memory policy: Data cache writeback
Reserved memory: created DMA memory pool at 0x4c000000, size 8 MiB
OF: reserved mem: initialized node vram@4c000000, compatible id shared-dma-pool
cma: Reserved 16 MiB at 0x6f000000
Zone ranges:
Normal [mem 0x0000000060000000-0x000000006fffffff]
Movable zone start for each node
Early memory node ranges
node 0: [mem 0x0000000060000000-0x000000006fffffff]
Initmem setup node 0 [mem 0x0000000060000000-0x000000006fffffff]
(省略)
Welcome to Buildroot
buildroot login:
無事に起動しました。
ユーザは root で、パスワード無しでログインできます。
/bin/ls
lrwxrwxrwx 1 root root 7 Jun 18 13:59 /bin/ls -> busybox*
デフォルトで、BusyBox が使われているようです。
BusyBox の場合、shutdown コマンドではなく、poweroff コマンドで終了します。
Stopping klogd: OK
Stopping syslogd: OK
Seeding 256 bits and crediting
Saving 256 bits of creditable seed for next boot
umount: devtmpfs busy - remounted read-only
EXT4-fs (mmcblk0): re-mounted. Quota mode: disabled.
The system is going down NOW!
Sent SIGTERM to all processes
Sent SIGKILL to all processes
Requesting system poweroff
Flash device refused suspend due to active operation (state 20)
Flash device refused suspend due to active operation (state 20)
reboot: Power down
終了すると、起動したコンソールに制御が戻ってきます。
今回はここまでにします。
おわりに
今回は、簡単な手順で、QEMU の組み込み Linux を起動するところまでやってみました。
Buildroot のロゴは、黄色いヘルメットのようです。ありがたくアイキャッチ画像に使わせて頂きました。
次回は、u-boot の組み込みなど、やってみたいと思います。
最後になりましたが、エンジニアグループのランキングに参加中です。
気楽にポチッとよろしくお願いいたします🙇
今回は以上です!
最後までお読みいただき、ありがとうございました。