3.3 goldfish平台的内核和驱动
↘3.3.1 goldfish平台和内核概述
goldfish是一种虚拟的ARM处理器,在Android的仿真环境中使用。在Linux的内核中,goldfish作为ARM体系结构的一种“机器”。goldfish的内核基于标准的Linux内容,其中增加了Android的专用驱动和组件,goldfish平台板级的移植内容,goldfish中各种模拟硬件设备的驱动程序。
使用git下载goldfish内核的方法如下所示:
$ git clone https://android.googlesource.com/kernel/goldfish
目前使用的工程名称为kernel/goldfish,另外还有一个名称为kernel/common的工程,表示通用内核,当中的内容有一部分也是类似的。
进入目录后,使用一个稳定版本的方法如下所示:
$ cd goldfish $ git branch -r origin/HEAD -> origin/master origin/android-goldfish-2.6.29 origin/android-goldfish-3.4 origin/linux-goldfish-3.0-wip origin/master $ git checkout origin/android-goldfish-2.6.29
goldfish平台有两个稳定的版本,分别基于开源的Linux2.6.29和Linux3.4,可以使用不同的分支进行选择。Android平台后续版本的发展实际上和内核版本的关系不大,因此各个版本的内容可以通用。
在goldfish的Linux源代码的根目录中,配置和编译goldfish内核的过程如下所示:
$ make ARCH=arm goldfish_defconfig .config $ make ARCH=arm CROSS_COMPILE=<path>/arm-eabi-
设置和执行过程中,使用goldfish_defconfig作为配置文件,在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
goldfish与ARM平台的其他Linux的编译结果类似,但是没有内核模块(*.ko)。vmlinux是Linux进行编译和连接之后生成的Elf格式的文件,Image是未经过压缩的二进制文件,piggy是一个解压缩程序,zImage是解压缩程序和压缩内核的组合。
在Android源代码的根目录中vmlinux和zImage分别对应Android代码prebuilt中的预编译的arm内核。在仿真器环境中,使用zImage,可以替换prebuilt中的prebuilt/android-arm/目录中的kernel-qemu文件,即可以使用自己编译出来的Linux内核。
↘3.3.2 goldfish体系结构移植
goldfish处理器有ARMv5和ARMv7两个版本,它们分别使用arch/arm/configs/目录中的goldfish_defconfig和goldfish_armv7_defconfig作为其配置文件。
内核配置文件goldfish_defconfig的一些片段如下所示:
CONFIG_ARM=y # # System Type # CONFIG_ARCH_GOLDFISH=y # # Goldfish Options # CONFIG_MACH_GOLDFISH=y # CONFIG_MACH_GOLDFISH_ARMV7 is not set CONFIG_CPU_ARM926T=y
由于goldfish虚拟处理器属于ARM体系结构,因此配置宏CONFIG_ARM需要被使能,配置宏CONFIG_ARCH_GOLDFISH和CONFIG_MACH_GOLDFISH是goldfish处理器这类机器使用的配置宏。CONFIG_CPU_ARM926T表示的实际上是ARMv5体系结构。
goldfish_armv7_defconfig当中使能的宏是CONFIG_MACH_GOLDFISH_ARMV7,没有CONFIG_CPU_ARM926T,但使能了CONFIG_CPU_V7、CONFIG_CPU_VFP等几个与体系结构相关的宏。其他的配置部分,二者则是完全相同的。
配置文件中的几个与Android系统相关的宏如下所示:
# # Android # CONFIG_ANDROID=y CONFIG_ANDROID_BINDER_IPC=y # Binder IPC驱动程序 CONFIG_ANDROID_LOGGER=y # Log记录器驱动程序 # CONFIG_ANDROID_RAM_CONSOLE is not set # Ram控制台 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
配置文件中,一些用于配置驱动程序的宏如下所示:
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处理器是ARM体系结构的一种“机器”,其代码在arch/arm/mach-goldfish/目录中,其中主要的内容如下所示。
·board-goldfish.c:板级主文件。
·timer.c:定时器部分的实现。
·pm.c:电源管理部分的实现。
·include/mach//:相关的头文件。
arch/arm/mach-goldfish/目录中的Kconfig是goldfish的主配置文件,内容如下所示:
if ARCH_GOLDFISH menu "Goldfish Options" config MACH_GOLDFISH bool "Goldfish (Virtual Platform)" select CPU_ARM926T config MACH_GOLDFISH_ARMV7 bool "Goldfish ARMv7 (Virtual Platform)" select CPU_V7 select VFP select VFPv3 select NEON endmenu endif
当ARCH_GOLDFISH宏被使能的时候,可以选择两种goldfish处理器,一种由MACH_GOLDFISH表示,一种由宏MACH_GOLDFISH_ARMV7表示。前者是一种ARMv5E体系结构的ARM926处理器,后者是ARMv7体系结构的处理器(即Cortex A),使能了VFP和NEON等特性。
arch/arm/mach-goldfish/目录中Makefile的内容如下所示:
obj-y := pdev_bus.o timer.o switch.o audio.o pm.o obj-$(CONFIG_MACH_GOLDFISH) += board-goldfish.o obj-$(CONFIG_MACH_GOLDFISH_ARMV7) += board-goldfish.o
arch/arm/mach-goldfish/board-goldfish.c是goldfish机器实现的核心文件,机器类型的定义如下所示:
MACHINE_START(GOLDFISH, "Goldfish") .phys_io = IO_START, .io_pg_offst = ((IO_BASE) >> l8) & 0xfffc, .boot_params = 0x00000l00, .map_io = goldfish_map_io, .init_irq = goldfish_init_irq, .init_machine = goldfish_init, .timer = &goldfish_timer, MACHINE_END
在MACHINE_START和MACHINE_END之间的内容为机器的信息。这里实现的结构是arch/arm/include/asm/mach/arch.h中定义的struct machine_desc。这里赋值了定时器、物理IO等内容,以及初始化机器、初始化irq、IO映射等函数指针。
在头文件中,hardware.h定义了内存的基地址,irqs.h定义了虚拟中断号。注意:由于goldfish处理器的各部分硬件都是虚拟的,因此其详细的“寄存器地址”在它们各自的驱动实现中定义,而不像实际的硬件使用全局的定义。
pdev_bus.c则是一个特殊的模拟设备注册的文件,它解决的是平台设备和平台驱动的匹配问题。在其内部实现中启用了一个线程(work),在线程循环中自动完成了各个设备的注册(platform_device_register)。
↘3.3.3 goldfish的相关设备驱动
goldfish是虚拟处理器,因此其中的各个设备也是虚拟的,读取虚拟的寄存器地址,并使用虚拟的中断,具体的内容在仿真器的支持环境中实现。这些虚拟设备的驱动程序的实现方式,大都基于Linux标准驱动程序的框架构建。很多虚拟设备使用虚拟的特殊功能寄存器和中断。
1.Framebuffer的驱动程序
goldfish虚拟处理器具有Framebuffer(帧缓冲)的驱动程序。此驱动程序的配置宏为CONFIG_FB_GOLDFISH,相关文件的路径为:drivers/video/goldfishfb.c。
Framebuffer的平台设备和平台驱动的名称是goldfish_fb,在用户空间的设备节点为:/dev/graphics/fb0。此驱动使用RGB565作为颜色空间,虚拟现实的高为实际的高的两倍,支持pan的操作。
2.键盘的驱动程序
goldfish虚拟处理器的输入部分(键盘)的驱动程序是Input驱动当中的Event类型。此驱动程序的配置宏为CONFIG_KEYBOARD_GOLDFISH_EVENTS,相关文件的路径为:drivers/input/keyboard/goldfish_events.c。
输入部分的平台设备和平台驱动的名称是goldfish_events,在用户空间的设备节点为:/dev/input/ event0。此驱动利用仿真器环境从虚拟寄存器中获取主机上的按键,并按照一般的方法传递给系统的其他部分。
3.实时时钟的驱动程序
goldfish虚拟处理器具有实时时钟的驱动程序。此驱动程序的配置宏为CONFIG_RTC_DRV_GOLDFISH,相关文件的路径为:drivers/rtc/rtc-goldfish.c。
实时时钟平台设备和平台驱动的名称是goldfish_rtc,其在用户空间的设备节点为/dev/rtc0,此节点一般不使用。仿真器的虚拟环境触发中断,并填充相关的寄存器,在此驱动程序中取得信息,并作为实时时钟(RTC)的数据。
4.TTY终端的驱动程序
goldfish虚拟处理器具有TTY终端的驱动程序,也就是提供了虚拟串口功能的驱动程序。此驱动程序的配置宏为CONFIG_GOLDFISH_TTY,相关文件的路径为:drivers/char/goldfish_tty.c
TTY平台设备和平台驱动的名称是goldfish_tty,在用户空间有3个设备,节点分别为/dev/ttyS0、/dev/ttyS1和/dev/ttyS2。串口的功能比实际的串口功能要简单得多,进行的是直接对虚拟寄存器的写操作,由仿真器环境根据情况进行处理。
5.NandFlash的驱动程序
goldfish虚拟处理器的NandFlash驱动程序是标准的MTD驱动程序。此驱动程序的配置宏为CONFIG_MTD_GOLDFISH_NAND,相关文件的路径为:drivers/mtd/devices/,其中goldfish_nand.c为实现文件,goldfish_nand_reg.c为虚拟寄存器的定义文件。
NandFlash平台设备和平台驱动的名称是goldfish_nand,并为每个分区构建字符设备和块设备。对于同一个分区,可能有两个字符设备分别用于读/写和只读。此驱动具体的功能均由仿真器环境根据内存的状况来实现。
6.MMC的驱动程序
goldfish虚拟处理器具有的MMC/SD卡的主机驱动程序。此驱动程序的配置宏为CONFIG_MMC_GOLDFISH,相关文件的路径为:drivers/mmc/host/goldfish.c。
MMC平台设备和平台驱动的名称是goldfish_mmc,根据SD卡的情况其中的设备将被识别,仿真器环境的SD卡使用映像文件模拟。
7.电池的驱动程序
goldfish虚拟处理器的电池驱动程序是Power Supply驱动。此驱动程序的配置宏为CONFIG_BATTERY_GOLDFISH,相关文件的路径为:drivers/power/goldfish_battery.c。
电池平台设备和平台驱动的名称是goldfish-battery,对用户空间的接口为sys文件系统。驱动程序中实现了读取属性等几个操作,通过读取虚拟的寄存器得到当前“电池”的信息。
8.音频的驱动程序
goldfish虚拟处理器的音频驱动程序是简易的驱动程序。此驱动程序的配置宏为CONFIG_ARCH_GOLDFISH,相关文件的路径为:drivers/misc/goldfish_audio.c。
音频驱动平台设备和平台驱动的名称是goldfish_audio,其在用户空间的设备节点为/dev/eac,对其进行读/写分别表示录音和放音。在读/写的时候,通过仿真器联系到主机的音频系统,获得声音的输入流和输出流。
9.qemu
QEMU仿真器的部分功能也需要在内核中有一些特殊的“硬件”支持,这些支持也在goldfish处理器的驱动中,两部分功能分别是qemutrace和qemupipe。
qemutrace使用CONFIG_QEMU_TRACE作为配置宏,源代码是drivers/misc/qemutrace/目录中的qemu_trace.c和qemu_trace_sysfs.c。qemutrace平台设备和平台驱动的名称为qemu_trace,它提供给用户空间的接口为Misc设备,设备节点为/dev/qemu_trace,以及sys文件系统的接口/sys/qemu_trace。
qemu_pipe用于为特殊的设备提供非常快速的通信通道,使用CONFIG_QEMU_PIPE作为配置宏,源代码是drivers/misc/qemupipe/目录中的qemu_pipe.c。qemu_pipe平台设备和平台驱动的名称为qemupipe,它提供给用户空间的接口为Misc设备,设备节点为/dev/qemu_pipe。