1. 程式人生 > >Android之Qemu和Goldfish

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先配置一下編譯選項

vmlinux是linux進行編譯和連線之後生成的Elf格式的檔案,Image是未經過壓縮的二進位制檔案,piggy是一個解壓縮程式,zImage是解壓縮程式和壓縮核心的組合。
 在android原始碼的根目錄中vmlinux和zImage分別對應android程式碼prebuilt中的預編譯的arm核心。

在goldfish處理器的各個配置選項中,體系結構和goldfish的虛擬驅動程式基於標準linux的內容的驅動程式框架,但是這些裝置在不同的硬體平臺的移植方式不同;android專用的驅動程式是android中特有的內容,非linux標準,但是和硬體平臺無關。

四. 啟動模擬器並載入新編譯的核心

$ emulator -kernel ~/原始碼路徑/kernel/goldfish/arch/arm/boot/zImage &