一. 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 &