前回記事の続きで、今回は、、、
QEMUでTOPPERS/ASPカーネルを動かしてしまいます!
すなわち、Linux(今回はUbuntu)さえあればRTOSが動かせるわけで、誰しも容易にRTOSが体験できます!
(本編の)本編
1. 準備
1-1. 環境
基本は前回記事を踏襲ですが、それら以外。
-
QEMU 0.14.0
TOPPERSで確認済みのバージョン。パッチを当ててからビルドします。
1-2. QEMUの準備
1-2-1. ダウンロード
QEMU 0.14.0
https://download.qemu.org/qemu-0.14.0.tar.gz
こいつを、以下のディレクトリに配置します。
user@user-VirtualBox:~/toppers/stellaris$ ls
asp asp-1.9.3.tar.gz asp_arch_arm_m_gcc-1.7.0.tar.gz cfg-linux-static-1_9_6.gz qemu-0.14.0.tar.gz
1-2-2. 展開
tarコマンドで展開。
user@user-VirtualBox:~/toppers/stellaris$ tar zxf qemu-0.14.0.tar.gz
user@user-VirtualBox:~/toppers/stellaris$ ls
asp asp-1.9.3.tar.gz asp_arch_arm_m_gcc-1.7.0.tar.gz cfg-linux-static-1_9_6.gz qemu-0.14.0 qemu-0.14.0.tar.gz
1-2-3. パッチ適用
ASPカーネルのターゲット依存部のマニュアル(asp/target/lm3sxxxx_gcc/target_user.txt)によれば、QEMUにはパッチを当てる必要性があるとのこと。
以下コマンドを投入します。
user@user-VirtualBox:~/toppers/stellaris$ cd qemu-0.14.0/
user@user-VirtualBox:~/toppers/stellaris/qemu-0.14.0$ patch -p2 < ../asp/target/lm3sxxxx_gcc/qemu-0.14.0-patch.diff
patching file configure
patching file gdbstub.c
patching file hw/a9mpcore.c
patching file hw/arm_gic.c
patching file hw/arm11mpcore.c
patching file hw/mpcore.c
patching file hw/realview.c
patching file scripts/signrom.sh
patching file target-arm/helper.c
1-2-4. configure
以下コマンドを実行。
user@user-VirtualBox:~/toppers/stellaris/qemu-0.14.0$ mkdir OBJ
user@user-VirtualBox:~/toppers/stellaris/qemu-0.14.0$ cd OBJ/
user@user-VirtualBox:~/toppers/stellaris/qemu-0.14.0/OBJ$ ../configure --target-list=arm-softmmu
Install prefix /usr/local
BIOS directory /usr/local/share/qemu
(略)
rbd support no
xfsctl support no
なお私の環境では、このままmakeすると
timer_gettimeがない
と怒られビルドが通らなかったので、以下のように設定を書き換えています。
user@user-VirtualBox:~/toppers/stellaris/qemu-0.14.0/OBJ$ diff config-host.mak.old config-host.mak
76c76
< LIBS+=-lpthread
---
> LIBS+=-lpthread -lrt
1-2-5. make
これでmakeが通ることを確認。
user@user-VirtualBox:~/toppers/stellaris/qemu-0.14.0/OBJ$ make
GEN arm-softmmu/config-devices.mak
GEN config-all-devices.mak
(略)
Signing optionrom/linuxboot.bin
rm multiboot.o linuxboot.raw linuxboot.img multiboot.raw multiboot.img linuxboot.o
1-2-6. リンクを張る
今後の作業簡略化のため、QEMU実行ファイルへのリンクを張っておきます。
user@user-VirtualBox:~/toppers/stellaris/qemu-0.14.0/OBJ$ cd ../../
user@user-VirtualBox:~/toppers/stellaris$ ls qemu-0.14.0/OBJ/arm-softmmu/qemu-system-arm
qemu-0.14.0/OBJ/arm-softmmu/qemu-system-arm
user@user-VirtualBox:~/toppers/stellaris$ ln -s qemu-0.14.0/OBJ/arm-softmmu/qemu-system-arm
user@user-VirtualBox:~/toppers/stellaris$ ls
asp asp_arch_arm_m_gcc-1.7.0.tar.gz qemu-0.14.0 qemu-system-arm
asp-1.9.3.tar.gz cfg-linux-static-1_9_6.gz qemu-0.14.0.tar.gz
2. いよいよ動かす!
2-1. まずは、通常起動
以下コマンドで動作するはずです。
パラメータがかなり多いので、コピーすることを強く推奨。
user@user-VirtualBox:~/toppers/stellaris$ ./qemu-system-arm -cpu cortex-m3 -M lm3s6965evb -serial stdio -no-reboot -icount auto --kernel asp/OBJ/asp -L ./qemu-0.14.0/pc-bios
VNC server running on `127.0.0.1:5900'
TOPPERS/ASP Kernel Release 1.9.3 for LM3SXXXX(ARM Cortex-M3) (Aug 19 2019, 11:39:23)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2014 by Embedded and Real-Time Systems Laboratory
Graduate School of Information Science, Nagoya Univ., JAPAN
System logging task is started on port 1.
Sample program starts (exinf = 0).
task1 is running (001). |
task1 is running (002). |
(略)
なお、-Lオプションは、私の環境ですと初回に以下エラーで起動しなかったので、無理矢理追加してみました。
(1回でも起動すれば大丈夫ぽいですが、面倒なので追ってはいません、笑)
Could not read keymap file: 'en-us'
なお、正常動作はこちらの記事を参考にしてください。
2-2. GDBデバッグするなら
QEMUはサーバー機能があるので、GDBデバッグが可能です。
これには以下のように「-s -S」オプションを追加してやればよいです。
(「-s」は「-gdb tcp::1234」と同じ意味です)
user@user-VirtualBox:~/toppers/stellaris$ ./qemu-system-arm -cpu cortex-m3 -M lm3s6965evb -serial stdio -no-reboot -icount auto --kernel asp/OBJ/asp -L ./qemu-0.14.0/pc-bios -s -S
VNC server running on `127.0.0.1:5900'
(-Sオプション指定により、ここで止まる)
GDBクライアント側は以下のごとく、起動後にtargetでアタッチしてやればよいですね。
user@user-VirtualBox:~/toppers/stellaris$ arm-none-eabi-gdb asp/OBJ/asp
GNU gdb (7.10-1ubuntu3+9) 7.10
Copyright (C) 2015 Free Software Foundation, Inc.
(略)
Type "apropos word" to search for commands related to "word"...
Reading symbols from asp/OBJ/asp...done.
(gdb) target remote:1234
Remote debugging using :1234
_start () at ../arch/arm_m_gcc/common/start.S:63
63 cpsid f /* 割込みロック状態へ */
(gdb) c
Continuing.
(以降はご自由に・・・)
3. おまけ
自分用メモみたいなもの
-
ターゲットを「lm3s811evb」とすると起動しない
QEMU内部のRAMサイズ定義誤り。「lm3s6965evb」と同等にする必要がある。
-
パッチを当てないとどうなるか
起動はするが、以下が出まくる。泣
最新版のQEMUにパッチが当たるか、当ててどうなるかは試してない。
../kernel/time_event.c:356: Assertion `sense_context()' failed.
おわりに
えーと、想像より遥かに大変でした。笑
言うならば、ASPカーネルのドキュメントに従っただけなのですが、何しろ情報が古い(確認環境も古い)ので、そのギャップが原因かと思います。
今回は(も)?とりあえず動かしてみたよってだけですので、今後はより使いやすいモノ・情報を提供していく予定です!
参考
(特になし)