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

トラックバック一覧

前回はgoldfishのCPUをarm1136に置き換えました。今度はarmv7アーキテクチャのcortex-A8への置き換えに成功したのでその方法を紹介します。 armv7だとNEONのSIMD命令とかThumb2とか色々と面白そうです。

コメント一覧

1. Posted by Zova   2011年06月17日 20:17
5 Hi, this article really helps me a lot, thanks! I tried your steps and get the kernel zImage. However, booting stops after uncompress.

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?
2. Posted by koba   2011年06月18日 01:38
Hi Zova,
You should check out korg/android-goldfish-2.6.29.
Read this page.
http://blog.kmckk.com/archives/1427864.html

コメントする

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

QRコード
QRコード