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



トラックバックURL

トラックバック一覧

1. クロス開発でのQEMU まとめ(基礎編)  [ KMC Staff Blog ]   2010年09月16日 11:08
ここまでのQEMUの記事のリンク集です。 なお、CELFテクニカルジャンボリーにて、時間をいただきましたので、このあたりについて話をさせていただきます。 (3月5日 中野サンプラザ 入場無料) よろしければご参加ください。

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード