LoginSignup
5
5

More than 3 years have passed since last update.

QEMUでTOPPERS/ASPカーネルを動かす - 本編

Last updated at Posted at 2019-08-19

前回記事の続きで、今回は、、、
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カーネルのドキュメントに従っただけなのですが、何しろ情報が古い(確認環境も古い)ので、そのギャップが原因かと思います。

今回は(も)?とりあえず動かしてみたよってだけですので、今後はより使いやすいモノ・情報を提供していく予定です!

参考

(特になし)

5
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5