2010年02月17日
ARM QEMU上のDebianを最新のカーネルに差し替えてさらにSMPで動かしてみる
前回nfsからブートできるようにしたことで、ユーザーランドとカーネルの依存性が少なくなりました。そこでカーネルを最新のものに差し替えてみます。
さらに、qemuの仮想ハードウェアをARM926のversatileからARM11MPcoreのRealview_EBボードにさしかえて、SMPでの動作を見てみます。
QEMUとLinuxカーネルをそれぞれ新しいものに差し替える
QEMUのソースをgitからおろしてきてビルド
0.12.2以降にもバグフィックスがされているようですが、まだ0.12.3はリリースされていません。
そこでgitのリポジトリからソースをおろしてくることにします。
masterは0.13に向けてたくさん変更されているので、stable-0.12というブランチに切り替えます。
$ git clone git://git.savannah.nongnu.org/qemu.git $ cd qemu $ git branch -r origin/HEAD -> origin/master origin/master origin/stable-0.10 origin/stable-0.11 origin/stable-0.12 origin/staging $ git checkout -b stable-0.12 origin/stable-0.12
以前と同様にconfigureしてビルド。
私の場合はいろいろとたくさんのqemuをビルドしているので、それらが混ざらないように--prefixにはカレントディレクトリの下のwork を指定しています。/usr/local にインストールするならば--prefixの指定は省略可能です。
$ cd .. $ mkdir obj $ cd obj $ ../qemu/configure --prefix=$PWD/work --target-list=arm-softmmu --disable-docs $ make -j4 2>&1 |tee make.log
WindowsのMSYS環境でも同様にしてqemuをビルドすることができました。
最新のカーネルソースのアーカイブを取得してビルド
http://www.kernel.org/ から最新のstableのカーネルを持ってきます。このときは2.6.32.8でした。
$ tar xvf linux-2.6.32.8.tar.bz2 $ cp -al linux-2.6.32.8 linux-2.6.32.8_versatile $ cd linux-2.6.32.8_versatile/ $ export ARCH=arm $ export CROSS_COMPILE=$ANDROID_TOP/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- $ make versatile_defconfig $ make menuconfig $ make -j4 zImage 2>&1 |tee make.log
make menuconfigの時に以下の項目を変更します。
Kernel Features ---> [*] Use the ARM EABI to compile the kernel Networking support ---> Networking options ---> [*] TCP/IP networking [*] IP:kernel level autoconfiguration [*] IP: DHCP support Kernel hacking ---> [*] Compile the kernel with debug info
最後のdebug info はお好みに応じて。
QEMUで最新カーネルを起動
先ほどビルドしたqemu-system-armにあらかじめPATHを通しておきます。
前回やったようにnfsrootで起動します。
$ qemu-system-arm -M versatilepb -m 256 -kernel arch/arm/boot/zImage \ -redir tcp:55555::22 \ -append "root=/dev/nfs rw nfsroot=192.168.xx.xx:/export/debian_lenny_armel/root ip=dhcp "
無理やり新しいカーネルに差し替えているので、udevなどはバージョンの不整合のせいか警告メッセージがたくさんでますが、とりあえず立ち上がってログインできるようになります。
(2010.2.24 追記)
udevやhalの警告メッセージはmenuconfigに以下を追加してカーネルを再ビルドすれば収まります。
File systems ---> [*] Inotify file change notification support Pseudo filesystems ---> [*] Virtual memory file system support (former shm fs) [*] Tmpfs POSIX Access Control Lists
仮想ハードウェアをRealView EBボードに変更してみる
ビルドしたQEMUは以下の仮想ボードをサポートしています。
$ qemu-system-arm -M ? Supported machines are: syborg Syborg (Symbian Virtual Platform) musicpal Marvell 88w8618 / MusicPal (ARM926EJ-S) mainstone Mainstone II (PXA27x) n800 Nokia N800 tablet aka. RX-34 (OMAP2420) n810 Nokia N810 tablet aka. RX-44 (OMAP2420) cheetah Palm Tungsten|E aka. Cheetah PDA (OMAP310) sx1 Siemens SX1 (OMAP310) V2 sx1-v1 Siemens SX1 (OMAP310) V1 tosa Tosa PDA (PXA255) akita Akita PDA (PXA270) spitz Spitz PDA (PXA270) borzoi Borzoi PDA (PXA270) terrier Terrier PDA (PXA270) connex Gumstix Connex (PXA255) verdex Gumstix Verdex (PXA270) lm3s811evb Stellaris LM3S811EVB lm3s6965evb Stellaris LM3S6965EVB realview-eb ARM RealView Emulation Baseboard (ARM926EJ-S) realview-eb-mpcore ARM RealView Emulation Baseboard (ARM11MPCore) realview-pb-a8 ARM RealView Platform Baseboard for Cortex-A8 realview-pbx-a9 ARM RealView Platform Baseboard Explore for Cortex-A9 versatilepb ARM Versatile/PB (ARM926EJ-S) versatileab ARM Versatile/AB (ARM926EJ-S) integratorcp ARM Integrator/CP (ARM926EJ-S) (default)
理論上はこれらのボードを全て所有しているのと同じことですが、
実際にやってみるとなかなか簡単には動きません。設定の問題なのか、カーネルのコンフィグの問題なのか、QEMUのバグなのか ...
(本当はCortex-A9を動かしてみたかったのですが)Realview EB(ARM11MPCore)ではうまく動いたので、その手順をここで紹介します。
Realview_EB用のカーネルのビルド
$ cp -al linux-2.6.32.8 linux-2.6.32.8_realview_eb $ cd linux-2.6.32.8_realview_eb/ $ export ARCH=arm $ export CROSS_COMPILE=$ANDROID_TOP/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- $ make realview-smp_defconfig $ make menuconfig $ make -j4 zImage 2>&1 |tee make.log
make menuconfigの時に以下の項目を変更します。
System Type ---> RealView platform type ---> [*] Support ARM11MPCore RevB tile [ ] Support RealVIew/PB11MPCore platform (マークを外す) [ ] High physical base address for the RealView platform (マークを外す)
(2010.2.24 追記)
udev, halの警告をなくすために以下も追加してください。
General setup ---> [ ] enable deprecated sysfs features which may confuse old usersp (マークを外す) File systems ---> Pseudo filesystems ---> [*] Virtual memory file system support (former shm fs) [*] Tmpfs POSIX Access Control Lists
起動
カーネル自体はSMP対応ですが、とりあえずCPUはひとつで起動します。-Mオプションでの仮想ボードの指定をversatilepbでなくrealview-eb-mpcoreに変更します。それ以外は今までと同じです。
$ qemu-system-arm -M realview-eb-mpcore -m 256 \ -kernel arch/arm/boot/zImage \ -redir tcp:55555::22 \ -append "root=/dev/nfs rw nfsroot=192.168.xx.xx:/export/debian_lenny_armel/root ip=dhcp "
CPUの数を3つにして起動
今度は複数個のCPUを指定して起動します。-smp オプションでCPUの個数を指定できます。
$ qemu-system-arm -M realview-eb-mpcore -m 256 -smp 3 \ -kernel arch/arm/boot/zImage \ -redir tcp:55555::22 \ -append "root=/dev/nfs rw nfsroot=192.168.xx.xx:/export/debian_lenny_armel/root ip=dhcp "
起動時にフレームバッファに三羽のペンギンが描かれます。
起動にはとってもとっても時間がかかります。これは現状のQEMUのSMPの実装がとても原始的であるためだと思われます。シングルスレッドの中で時分割でマルチコアをシミュレートしています。(QEMUメモ(2)参照)
起動後に/proc/cpuinfoを見ると以下のようになります。BogoMIPSの値が偏ってます。
user@debian_armel:~$ cat /proc/cpuinfo Processor : ARMv6-compatible processor rev 2 (v6l) processor : 0 BogoMIPS : 620.95 processor : 1 BogoMIPS : 52.42 processor : 2 BogoMIPS : 45.87 Features : swp half thumb fastmult vfp edsp java CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xb02 CPU revision : 2 Hardware : ARM-RealView EB Revision : 0000 Serial : 0000000000000000