2009年08月05日
Android SDKのgoldfishのCPUをarm1136に置き換える方法
AndroidのSDKではgoldfishという仮想ハードウェアをqemuで動作させています。この環境は実際のハードウェアがなくても動作させることができるのでとても便利です。goldfishはCPUがARMv5TEアーキテクチャのarm926なのですが、これをARMv6アーキテクチャのarm1136に置き換える実験をしてみたところ意外にすんなり動きました。
その手順をここで紹介します。
2009年11月のEclairのソースリリースでだいぶ状況が変わっています。こちらも参照してください。
以下の作業はUbuntu 9.04上で行いました。Androidのビルドの方法はこちら(http://d.hatena.ne.jp/embedded/20090510/p1)を参照してください。
きんねこさんのページ(http://d.hatena.ne.jp/kinneko/20090526/p5)を参考にさせてもらってgoldfish用のカーネルソースをとってきます。
$ cd kernel $ git checkout korg/android-goldfish-2.6.27
繰り返しの作業が楽になるようにビルドの手順をスクリプトにしておきます。
$ cat build.sh make ARCH=arm goldfish_defconfig make -j4 ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- V=1
カーネルをビルドします。
$ make distclean $ time ./build.sh > make.log 2>&1
今ビルドしたカーネルに差し替えて動作することを確認します。
emulatorに -kernel オプションで圧縮されたカーネルイメージの場所を指定します。
$ cd out/host/linux-x86/sdk/android-sdk_eng.koba_linux-x86/tools $ ./adb logcat & ./emulator -kernel ../../../../../../kernel/arch/arm/boot/zImage -avd donut1
次にカーネルソースに以下の修正を加えます。
diff --git a/arch/arm/mach-goldfish/Kconfig b/arch/arm/mach-goldfish/Kconfig index b4463a9..aad4414 100644 --- a/arch/arm/mach-goldfish/Kconfig +++ b/arch/arm/mach-goldfish/Kconfig @@ -4,7 +4,7 @@ menu "Goldfish Options" config MACH_GOLDFISH bool "Goldfish (Virtual Platform)" - select CPU_ARM926T + select CPU_V6 endmenu diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 9d9c1e6..c361575 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig @@ -180,7 +180,7 @@ config CPU_ARM925T # ARM926T config CPU_ARM926T bool "Support ARM926T processor" - depends on ARCH_GOLDFISH || ARCH_INTEGRATOR || ARCH_VERSATILE_PB || \ + depends on ARCH_INTEGRATOR || ARCH_VERSATILE_PB || \ MACH_VERSATILE_AB || ARCH_OMAP730 || \ ARCH_OMAP16XX || MACH_REALVIEW_EB || \ ARCH_PNX4008 || ARCH_NETX || CPU_S3C2412 || \ @@ -400,7 +400,7 @@ config CPU_FEROCEON_OLD_ID # ARMv6 config CPU_V6 bool "Support ARM V6 processor" - depends on ARCH_INTEGRATOR || MACH_REALVIEW_EB || ARCH_OMAP2 ||
ARCH_MX3 || ARCH_MSM7X00A || MACH_REALVIEW_PB11MP || MACH_REALVIEW_PB1176 + depends on ARCH_GOLDFISH || ARCH_INTEGRATOR || MACH_REALVIEW_EB ||
ARCH_OMAP2 || ARCH_MX3 || ARCH_MSM7X00A || MACH_REALVIEW_PB11MP ||
MACH_REALVIEW_PB1176 default y if ARCH_MX3 default y if ARCH_MSM7X00A select CPU_32v6
今度はemulator に -qemu -cpu arm1136 のオプションを与えて起動します。
$ cd out/host/linux-x86/sdk/android-sdk_eng.koba_linux-x86/tools $ ./adb logcat & ./emulator -kernel ../../../../../../kernel/arch/arm/boot/zImage -avd donut1 -qemu -cpu
arm1136
うまく起動できたら、別のターミナルからログインして /proc/cpuinfo を確認してみます。
$ cd out/host/linux-x86/sdk/android-sdk_eng.koba_linux-x86/tools $ ./adb shell # cat /proc/cpuinfo Processor : ARMv6-compatible processor rev 3 (v6l) BogoMIPS : 413.69 Features : swp half thumb fastmult vfp edsp java CPU implementer : 0x41 CPU architecture: 6TEJ CPU variant : 0x1 CPU part : 0xb36 CPU revision : 3 Cache type : write-through Cache clean : not required Cache lockdown : not supported Cache format : Harvard I size : 4096 I assoc : 4 I line length : 32 I sets : 32 D size : 65536 D assoc : 4 D line length : 32 D sets : 512 Hardware : Goldfish Revision : 0000 Serial : 0000000000000000 #
ARMv6で動作していることが確認できました。参考までにオリジナルのemulatorでの /proc/cpuinfo は以下のようになっていました。
./adb shell # cat /proc/cpuinfo Processor : ARM926EJ-S rev 5 (v5l) BogoMIPS : 401.40 Features : swp half thumb fastmult vfp edsp java CPU implementer : 0x41 CPU architecture: 5TEJ CPU variant : 0x0 CPU part : 0x926 CPU revision : 5 Cache type : write-through Cache clean : not required Cache lockdown : not supported Cache format : Harvard I size : 4096 I assoc : 4 I line length : 32 I sets : 32 D size : 65536 D assoc : 4 D line length : 32 D sets : 512 Hardware : Goldfish Revision : 0000 Serial : 0000000000000000 #
この実験でわかったことは
- goldfishはCPUコアの依存性は少なく、CPUコアの変更は容易。
- arm1136にしてもユーザーランドは無変更で動く。
- qemuもビルドし直す必要はなく、-cpu arm1136 というオプションを与えるだけでよい。
ユーザーランドはこれからarm1136用にチューニングしていくと、いろいろと面白いことができそうです。
調子に乗って、同じような方法でARMv7アーキテクチャであるcortex-a8も試したのですが、こちらはうまくいきませんでした。いろいろな部分を最新版に差し替えていく必要があるようですが、腕に自信のある方はぜひ挑戦してみてください。
(2009.8.24 追記)
coretex-a8への置き換えもうまくいきました。
http://blog.kmckk.com/archives/1427864.html
(追記)
最近repoのマニュフェストファイルが更新されて、デフォルトではkernelのソースはダウンロードされなくなりました。
以下のように個別にgitを使うことでgoldfish kernelのソースを取得することができます。
$ mkdir kernel $ git clone git://android.git.kernel.org/kernel/common.git $ cd common $ git branch -r origin/HEAD origin/android-2.6.25 origin/android-2.6.27 origin/android-2.6.29 origin/android-goldfish-2.6.27 origin/android-goldfish-2.6.29 $ git checkout -b android-goldfish-2.6.27 origin/android-goldfish-2.6.27 Branch android-goldfish-2.6.27 set up to track remote branch refs/remotes/origin/android-goldfish-2.6.27. Switched to a new branch "android-goldfish-2.6.27"
トラックバックURL
トラックバック一覧
コメント一覧

The only difference is: I check out 2.6.29 and find no ARCH_GOLDFISH or MACH_GOLDFISH* specified in arch/arm/mm/Kconfig: CPU_ARM926T. So, how the building system determine which arch to choose?
You should check out korg/android-goldfish-2.6.29.
Read this page.
http://blog.kmckk.com/archives/1427864.html