開発/動作環境について説明します。
Linux
QEMUで実行するLinuxを用意します。なんでも良いのですが、
頻繁に再起動することになるので
とりあえずBuildroot( http://buildroot.uclibc.org/ )を用いて最小限の環境を用意しました。
Buildrootには各種QEMU用のコンフィギュレーションが
configsディレクトリ以下に用意されているので、これを利用して
必要に応じて変更を加えます。
具体的にはソースコードをダウンロード、展開後に
make qemu_x86_defconfig // i386 向け
make menuconfig
-> toolchain を glibcに (デフォルトではuClibc)
-> buildoptions の number of jobs を 0 から8に
make linux-menuconfig
-> enable loadable module をチェク (デフォルトではoff)
make
とします。他にも必要があれば make busybox-menuconfig などとします。
上記の通りにmakeを行うとカーネルイメージと(ブートローダを含まない)ext2 ルートファイルシステム(圧縮なし) が output/iamges 以下に作成されます。
このままではルートファイルシステムが小さいので
dd if=/dev/zero of=image bs=10000 count=100 // (100M)
mkfs -t ext2 -m 0 image
mkdir mnt
sudo mount -o loop,rw -t ext2 image mnt/
などとして適当にディスクイメージを作成、マウントした後にデータをコピーします
(Buildroot の設定からルートファイルシステムのサイズを変更する方法が
分からなかったためこうしました)。
QEMU
自分でコンパイルする必要があるので http://wiki.qemu.org/
よりソースコードをダウンロードしてきます。
単純にconfig, make をするとあらゆるアーキテクチャに対応したQEMUが作成されて
時間がかかるので、
./configure --target-list="i386-softmmu"
として、i386 用のみをコンパイルするようにします。実行ファイルは
i386-softmmu/qemu-system-i386 となります。
追加仮想デバイスのコンパイル
hw/char 以下にキャラクタデバイスの実装ファイルがあります。
今回はここに新たに作成したファイル(test_pci_device.c)を置きました。
同ディレクトリにある Makefile.obj に
obj-$(CONFIG_PCI) += test_pci_device.o
を追加します(因みにi386-softmmu/config-device.mak で CONFIG_PCI=y となっています)。
これにより test_pci_device がmake時に一緒にコンパイルされます。
コンパイルしたQEMUを実行するには、
qemu-system-i386 \
-kernel bzImage \
-hda image \
-append "console=ttyS0 root=/dev/sda rw panic=1"
-nographic \
-no-reboot \
-device test_pci
などとします(パス/ファイル名は適当に変えてください)。
ブートローダ無しで起動が行えます。
-nographic オプションを使用することでCUI環境のみでQEMUを実行できます。
-no-reboot とカーネルオプション(-append 以下)の panic=1 を利用することで、カーネルパニック1秒後に
QEMUが終了します。作成したPCIデバイスを -device オプションで渡します。
なお、この場合 ctrl-a+c でモニタ画面に移動でき
(GUI 版は alt-ctrl-2)、 ctrl-a+x でQEMUを終了できます。
モニタ画面では各種コマンドを実行できます。例えば、info pci
とタイプすると接続している PCIデバイスの状況が確認できます。
はじめ: [(1) 作ったもの]
(http://qiita.com/rafilia/items/f7646d12212da2a85bd8)
前: (2) 前提知識 (PCI / デバイスドライバ)
次: [(4) 仮想デバイス/ドライバの登録]
(http://qiita.com/rafilia/items/ba73703babb92276b55a)