2009年08月24日
AndroidのSDKのgoldfishのCPUをcortex-A8に置き換えてNEONのSIMD命令を試す(その1)
前回はgoldfishのCPUをarm1136に置き換えました。今度はarmv7アーキテクチャのcortex-A8への置き換えに成功したのでその方法を紹介します。
armv7だとNEONのSIMD命令とかThumb2とか色々と面白そうです。
2009年11月のEclairのソースリリースでだいぶ状況が変わっています。こちらも参照してください。
ポイント
先にポイントになるところを説明します。
- gccは4.4.0を使用する。
gcc 4.2.1ではまだarmv7アーキテクチャに対応していないので新しいものを使います。
- カーネルは2.6.29をベースにする。
どうやら2.6.27ではarmv7アーキテクチャでの動作実績はなさそうです。CPU_V7を有効にしてビルドすると単純なスペルミスでコンパイルエラーになります。
- TLSレジスタを使わないようにする。
実はこれがわからずにハマりました。理由はよくわかりませんが、OMAP3530用のソースではTLSレジスタを使わないようになっていたので、それと同じにしてみたら無事に起動するようになりました。
- kernel以外は変更の必要がない。
emulator とユーザーランドのイメージはSDKのものをそのまま使います。
以下に順を追って手順を説明します。
カーネルのソースの入手
gitでカーネルソースを持ってきて、android-goldfish-2.6.29のブランチに切り替えます。
git clone git://android.git.kernel.org/kernel/common.git cd common git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29
カーネルソースの修正
まずは環境変数ARCHとCROSS_COMPILEの設定をMakefileの中に書き込んでしまいます。コンパイラは4.4.0を使用します。
diff --git a/Makefile b/Makefile index 1ab3ebf..ea1c291 100644 --- a/Makefile +++ b/Makefile @@ -190,8 +190,8 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ # Default value for CROSS_COMPILE is not to prefix executables # Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile export KBUILD_BUILDHOST := $(SUBARCH) -ARCH ?= $(SUBARCH) -CROSS_COMPILE ?= +ARCH ?= arm +CROSS_COMPILE ?= ../../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- # Architecture as present in compile.h UTS_MACHINE := $(ARCH)
次にGoldfishのCPUの指定をARM926TからV7に変更します。このあたりのファイル構成は2.6.27から変更されています。以下のように2箇所のKconfigを書き換えます。
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 909157b..f00f263 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -208,7 +208,7 @@ config ARCH_AAEC2000 config ARCH_GOLDFISH bool "Goldfish" - select CPU_ARM926T + select CPU_V7 select GENERIC_TIME select GENERIC_CLOCKEVENTS help diff --git a/arch/arm/mach-goldfish/Kconfig b/arch/arm/mach-goldfish/Kconfig index b4463a9..c09032b 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_V7 endmenu
最後にHAS_TLS_REGの設定が有効にならないようにします。
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index d490f37..9a6a482 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig @@ -667,7 +667,7 @@ config TLS_REG_EMUL config HAS_TLS_REG bool depends on !TLS_REG_EMUL - default y if SMP || CPU_32v7 + default n if SMP || CPU_32v7 help This selects support for the CP15 thread register. It is defined to be available on some ARMv6 processors (including
カーネルのビルド
make distclean make goldfish_defconfig make menuconfig make -j4 2>&1 |tee make.log
menuconfigのときに、
"Floating point emulation" の項目で "Advanced SIMD (NEON) Extension support" を有効にしておきます。
エミュレータの起動
まずは普通にSDKのemulatorが起動することを確認します。AVDは適当に作成してください。
$ emulator -shell -show-kernel -avd my_avd
次に、今ビルドしたカーネルに差し替えて起動します。
$ emulator -kernel mydroid/kernel/common/arch/arm/boot/zImage -shell -show-kernel -avd my_avd -qemu -cpu cortex-a8
-qemu 以降のオプションはすべてそのままqemuに送られるので、-qemu以降のオプションは最後に追加してください。
起動したらshellから /proc/cpuinfo を見てみます。
# cat /proc/cpuinfo Processor : ARMv7 Processor rev 0 (v7l) BogoMIPS : 244.12 Features : swp half thumb fastmult vfp edsp neon CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xc08 CPU revision : 0 Hardware : Goldfish Revision : 0000 Serial : 0000000000000000 #
neonも有効になっているようです。
kernelのイメージだけの差し替えで動くので、Linux上で作成したカーネルのzImage をWindowsに持っていってWindows上のemulatorに食わせても多分同じように動くと思います。
次回予告
長くなってしまったので今回はここまでにします。
次回はNDKを使ってNEONのSIMD命令をつかった共有ライブラリを作り、それをJNI経由で呼び出して動作することを確認したことを紹介します。
(2009.8.26 追記)
続きを書きました。
トラックバックURL
コメント一覧
$ diff -urpN common/arch/arm/configs/goldfish_defconfig commo
n/arch/arm/configs/goldfish_armv7_defconfig
--- common/arch/arm/configs/goldfish_defconfig 2009-09-29 11:08:32.000000000 +0900
+++ common/arch/arm/configs/goldfish_armv7_defconfig 2009-09-29 11:08:32.000000000 +0900
@@ -168,13 +168,16 @@ CONFIG_ARCH_GOLDFISH=y
#
# Goldfish Options
#
-CONFIG_MACH_GOLDFISH=y
+CONFIG_MACH_GOLDFISH_ARMV7=y
#
# Processor Type
#
CONFIG_CPU_32=y
-CONFIG_CPU_ARM926T=y
+CONFIG_CPU_V7=y
+CONFIG_CPU_VFP=y
+CONFIG_CPU_VFP3=y
+CONFIG_CPU_NEON=y
CONFIG_CPU_32v5=y
CONFIG_CPU_ABRT_EV5TJ=y
CONFIG_CPU_PABRT_NOIFAR=y
でも肝心のqemuの方はFPU命令で8バイトアクセスでバスエラーする件はまだのようです。Thumb2命令の実行も怪しい感じだし。
でもgoldfish_armv7を動かす人が増えれば、すぐにそれらも直ることでしょう。