Android之Qemu和Goldfish
一. Goldfish和qemu介紹
Google在開發Android系統的同時,使用qemu開發了針對每個版本的一個模擬器,這大大降低了開發人員的開發成本,便於Android技術的推廣。qemu是一個開源的模擬處理器軟體,而Google使用qemu模擬的是ARM926ej-S的Goldfish處理器,如果開發人員在沒有目標開發板的情況下,要對硬體進行操作的話,必然要去操作Android底層的驅動,我們可以使用模擬器的核心原始碼。
Android模擬器所對應的原始碼主要在external/qemu目錄下。
Goldfish是一種虛擬的ARM處理器,在Android的模擬環境中使用。Android模擬器通過執行它來執行arm926t指令集(arm926t屬於armv5構架,goldfish處理器有ARMv5和ARMv7兩個版本,在一般情況下,使用ARMv5的版本即可)。
在linux的核心中,Goldfish作為ARM體系結構的一種“mach”,它的核心內容存放在:arch/arm/mach-goldfish。
goldfish_defconfig 位置:kernel/arch/arm/configs在android的發展過程中,Goldfish核心的版本也進行了升級,.這個處理器的linux核心和標準的linux核心的差別有以下幾方面:
1. goldfish機器的移植。
2. goldfish一些虛擬裝置的驅動程式。
3. android中特有的驅動程式和元件。
Android模擬器被命名為goldfish,用來模擬包括下面一些功能的ARM SoC:
· ARM926ej-S CPU
· Thumb support
· MMC
· RTC
· Keyboard
· USB Gadget
· Framebuffer
· TTY driver
· NAND FLASH
編譯生成的linux核心映象在android的模擬器中使用。啟動模擬器時,Linux Kernel映象預設使用:prebuilt/android-arm/kernel目錄下的kernel-qemu檔案。
二. 下載Goldfish核心原始碼
首先進入到Android的原始碼目錄,建立原始碼目錄kernel:
$ cd WORKING_DIRECTORY
$ mkdir kernel
從Android的遠端原始碼倉庫下載原始碼:
$git clone http://android.googlesource.com/kernel/goldfish.git
當然,如果你要編譯指定目標平臺的kernel的話,也可以從指定的倉庫裡下載,官方給出了下列處理器的kernel:
$ git clone https://android.googlesource.com/kernel/common.git
$ git clone https://android.googlesource.com/kernel/exynos.git
$ git clone https://android.googlesource.com/kernel/goldfish.git
$ git clone https://android.googlesource.com/kernel/msm.git
$ git clone https://android.googlesource.com/kernel/omap.git
$ git clone https://android.googlesource.com/kernel/samsung.git
$ git clone https://android.googlesource.com/kernel/tegra.git
經過一段時間之後,在kernel目錄下生成了一個goldfish目錄.
$ cd goldfish
$ git branch
* master
可以看到我們的本地存在的分支是主線.
$ git branch -a 列出本地分支和遠端分支
* master
remotes/origin/HEAD -> origin/master
remotes/origin/android-3.10
remotes/origin/android-goldfish-2.6.29
remotes/origin/android-goldfish-3.10
remotes/origin/android-goldfish-3.4
remotes/origin/linux-goldfish-3.0-wip
remotes/origin/master
我們選擇android-goldfish-3.4
$ git checkout remotes/origin/android-goldfish-3.4
完成後,我們發現goldfish目錄下有了原始碼檔案.
三. 編譯Goldfish核心
$ export PATH=~/原始碼路徑/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin:$PATH$ export ARCH=arm
$ export SUBARCH=arm
$ export CROSS_COMPILE=arm-eabi-
$ make goldfish_armv7_defconfig # 如果是android4.0之前的版本,使用make goldfish_defconfig,主要是因為ieArm體系結構不同
這個過程會生成.config檔案
$ make
編譯成功後,可看到下面幾行:
LD vmlinux
SYSMAP System.map
SYSMAP .tmp_System.map
OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
AS arch/arm/boot/compressed/head.o
GZIP arch/arm/boot/compressed/piggy.gzip
AS arch/arm/boot/compressed/piggy.gzip.o
CC arch/arm/boot/compressed/misc.o
CC arch/arm/boot/compressed/decompress.o
CC arch/arm/boot/compressed/string.o
SHIPPED arch/arm/boot/compressed/lib1funcs.S
AS arch/arm/boot/compressed/lib1funcs.o
SHIPPED arch/arm/boot/compressed/ashldi3.S
AS arch/arm/boot/compressed/ashldi3.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is read
在執行make命令前,你也可以執行make menuconfig先配置一下編譯選項
在android原始碼的根目錄中vmlinux和zImage分別對應android程式碼prebuilt中的預編譯的arm核心。
在goldfish處理器的各個配置選項中,體系結構和goldfish的虛擬驅動程式基於標準linux的內容的驅動程式框架,但是這些裝置在不同的硬體平臺的移植方式不同;android專用的驅動程式是android中特有的內容,非linux標準,但是和硬體平臺無關。
四. 啟動模擬器並載入新編譯的核心
$ emulator -kernel ~/原始碼路徑/kernel/goldfish/arch/arm/boot/zImage &