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

[前回記事](https://qiita.com/imagou/items/b41a29440b389896080f)の続きで、今回は、、、
**QEMUでTOPPERS/ASPカーネルを動かしてしまいます！**

すなわち、Linux（今回はUbuntu）さえあればRTOSが動かせるわけで、誰しも容易にRTOSが体験できます！

# （本編の）本編

## 1. 準備

### 1-1. 環境

基本は[前回記事](https://qiita.com/imagou/items/b41a29440b389896080f#1-1-%E7%92%B0%E5%A2%83)を踏襲ですが、それら以外。

- 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

こいつを、以下のディレクトリに配置します。

```Console
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コマンドで展開。

```Console
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にはパッチを当てる必要性があるとのこと。
以下コマンドを投入します。

```Console
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

以下コマンドを実行。

```Console
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がない**

と怒られビルドが通らなかったので、以下のように設定を書き換えています。

```Console
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が通ることを確認。

```Console
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実行ファイルへのリンクを張っておきます。

```Console
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. まずは、通常起動

以下コマンドで動作するはずです。
パラメータがかなり多いので、コピーすることを強く推奨。

``` Console
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回でも起動すれば大丈夫ぽいですが、面倒なので追ってはいません、笑）

```Console
Could not read keymap file: 'en-us'
```

なお、正常動作は[こちらの記事](https://qiita.com/imagou/items/8e19ed77884af4fb4e71#3-%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D)を参考にしてください。

### 2-2. GDBデバッグするなら

QEMUはサーバー機能があるので、GDBデバッグが可能です。
これには以下のように「-s -S」オプションを追加してやればよいです。
（「-s」は「-gdb tcp::1234」と同じ意味です）

```Console
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でアタッチしてやればよいですね。

```Console
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にパッチが当たるか、当ててどうなるかは試してない。

```Console
../kernel/time_event.c:356: Assertion `sense_context()' failed.
```


# おわりに

えーと、想像より遥かに大変でした。笑

言うならば、ASPカーネルのドキュメントに従っただけなのですが、何しろ情報が古い（確認環境も古い）ので、そのギャップが原因かと思います。

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

# 参考

（特になし）