第4章 Android的GoldFish内核和驱动

4.1 GoldFish内核概述

GoldFish是一种虚拟的ARM处理器,在Android的仿真环境中使用。在Linux的内核中,GoldFish作为ARM体系结构的一种“机器”。在Android的发展过程中,GoldFish内核的版本也从Linux 2.6.25升级到了Linux 2.6.29。这个处理器的Linux内核和标准的Linux内核的差别有以下几个方面:

GoldFish机器的移植

GoldFish一些虚拟设备的驱动程序

Android中特有的驱动程序和组件

提示:GoldFish处理器有ARMv5和ARMv7两个版本,在通常情况下,使用ARMv5的版本即可。

从Android开源工程的代码仓库中,使用git工具得到goldfish内核的方式如下所示:

    $ git clone git://android.git.kernel.org/kernel/common.git

在其Linux源代码的根目录中,配置和编译goldfish内核的过程如下所示:

    $ make ARCH=arm goldfish_defconfig .config
    $ make ARCH=arm CROSS_COMPILE={path}/arm-none-linux-gnueabi-

其中,在CROSS_COMPILE=中指定交叉编译工具的路径。

Goldfish处理器的编译结果,最后的内容如下所示:

    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.gz
    AS      arch/arm/boot/compressed/piggy.o
    CC      arch/arm/boot/compressed/misc.o
    LD      arch/arm/boot/compressed/vmlinux
    OBJCOPY arch/arm/boot/zImage
    Kernel: arch/arm/boot/zImage is ready

vmlinux是Linux进行编译和连接之后生成的Elf格式的文件,Image是未经过压缩的二进制文件,piggy是一个解压缩程序,zImage是解压缩程序和压缩内核的组合。

在Android源代码的根目录中vmlinux和zImage分别对应Android代码prebuilt中的预编译的arm内核。

提示:使用zImage,替换prebuilt中的prebuilt/android-arm/目录中的kernel-qemu文件,即可以使用这个内核。

GoldFish处理器的config文件的路径为arch/arm/configs目录中的goldfish_defconfig,这个文件的一些片断如下所示:

    CONFIG_ARM=y
    #
    # System Type
    #
    CONFIG_ARCH_GOLDFISH=y
    #
    # Goldfish Options
    #
    CONFIG_MACH_GOLDFISH=y
    # CONFIG_MACH_GOLDFISH_ARMV7 is not set

由于GoldFish是ARM处理器,因此CONFIG_ARM宏需要被使能, CONFIG_ARCH_GOLDFISH和CONFIG_MACH_GOLDFISH宏是GoldFish处理器这类机器使用的配置宏。

goldfish_defconfig中的几个与Android系统相关的宏如下所示:

    #
    # Android
    #
    CONFIG_ANDROID=y
    CONFIG_ANDROID_BINDER_IPC=y               #  Binder IPC驱动程序
    CONFIG_ANDROID_LOGGER=y                    #  Log记录器驱动程序
    # CONFIG_ANDROID_RAM_CONSOLE is not set
    CONFIG_ANDROID_TIMED_OUTPUT=y             #  定时输出驱动程序框架
    CONFIG_ANDROID_LOW_MEMORY_KILLER=y
    CONFIG_ANDROID_PMEM=y                       #  物理内存驱动程序
    CONFIG_ASHMEM=y                              #  匿名共享内存驱动程序
    CONFIG_RTC_INTF_ALARM=y
    CONFIG_HAS_WAKELOCK=y                       #  电源管理相关的部分Wakelock和earlysuspend
    CONFIG_HAS_EARLYSUSPEND=y
    CONFIG_WAKELOCK=y
    CONFIG_WAKELOCK_STAT=y
    CONFIG_USER_WAKELOCK=y
    CONFIG_EARLYSUSPEND=y

goldfish_defconfig配置文件中,另外有一个宏是处理器虚拟设备的“驱动程序”,其内容如下所示:

    CONFIG_MTD_GOLDFISH_NAND=y
    CONFIG_KEYBOARD_GOLDFISH_EVENTS=y
    CONFIG_GOLDFISH_TTY=y
    CONFIG_BATTERY_GOLDFISH=y
    CONFIG_FB_GOLDFISH=y
    CONFIG_MMC_GOLDFISH=y
    CONFIG_RTC_DRV_GOLDFISH=y

在goldfish处理器的各个配置选项中,体系结构和Goldfish的虚拟驱动程序基于标准Linux的内容的驱动框架,但是这些设备在不同的硬件平台(包括处理器和平台)的移植方式不同;Android专用的驱动程序是Android中特有的内容,非Linux标准,但是和硬件平台无关。