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

コメント一覧

1. Posted by androidzaurus   2009年09月29日 11:23
git://android.git.kernel.org/kernel/common.git に goldfish-armv7-defconfig ががが。

$ 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
2. Posted by koba   2009年09月29日 13:42
おお!

でも肝心のqemuの方はFPU命令で8バイトアクセスでバスエラーする件はまだのようです。Thumb2命令の実行も怪しい感じだし。
でもgoldfish_armv7を動かす人が増えれば、すぐにそれらも直ることでしょう。

コメントする

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

QRコード
QRコード