Android之Goldfish
一. Goldfish介绍
Goldfish是一种虚拟的ARM处理器,在android的仿真环境中使用。Android模拟器通过运行它来运行arm926t指令集(arm926t属于armv5构架,goldfish处理器有ARMv5和ARMv7两个版本,在一般情况下,使用ARMv5的版本即可)。
编译生成的linux内核镜像在android的模拟器中使用。启动模拟器时,Linux Kernel镜像默认使用:prebuilt/android-arm/kernel目录下的kernel-qemu文件。
在linux的内核中,Goldfish作为ARM体系结构的一种“mach”,它的核心内容存放在:arch/arm/mach-goldfish。
goldfish_defconfig 位置:kernel/arch/arm/configs
在android的发展过程中,Goldfish内核的版本也从linux2.6.25升级到了linux2.6.29.这个处理器的linux内核和标准的linux内核的差别有以下几方面:
1. goldfish机器的移植。
2. goldfish一些虚拟设备的驱动程序。
3. android中特有的驱动程序和组件。
二. 编译Goldfish内核
从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=指定交叉编译工具的路径。
编译结果:
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 OBJCONPY 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/目录中的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_BUNDER_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标准,但是和硬件平台无关。
参考文章:
http://liangbing8612.blog.51cto.com/2633208/664447 《Android之Goldfish介绍》
http://hyb757.blog.163.com/blog/static/337191012011222101446891/ 《Android的Goldfish内核概述》
一.Android版本与Linux内核的关系
英文名 | 中文名 | Android版本 | Linux内核版本 |
No | 无 | 1.1 | |
Cupcake | 纸杯蛋糕 | 1.5 | 2.6.27 |
Donut | 甜甜圈 | 1.6 | 2.6.29 |
Eclair | 松饼 | 2.0 | 2.6.29 |
Eclair | 松饼 | 2.1 | 2.6.29 |
Froyo | 冻酸奶 | 2.2 | 2.6.32 |
Gingerbread | 姜饼 | 2.3 | 2.6.35 |
Honeycomb | 蜂巢 | 3.0 | ? |
二.下载源码分为2大部分
1.Android源码;
2.Android内核(Android Linux Kernel);
三.如何下载Android内核
git clone git://android.git.kernel.org/kernel/common.git
四.如何查看Android内核的版本(代码级查看)
在内核代码目录:
运行命令:git branch –a
运行实例
[root@localhost common]# git branch -a (查看版本)
* android-2.6.36
remotes/origin/HEAD -> origin/android-2.6.36
remotes/origin/android-2.6.35
remotes/origin/android-2.6.36
remotes/origin/archive/android-2.6.25
remotes/origin/archive/android-2.6.27
remotes/origin/archive/android-2.6.29
remotes/origin/archive/android-2.6.32
remotes/origin/archive/android-gldfish-2.6.29
remotes/origin/archive/android-goldfish-2.6.27
五.如何获得指定版本的Linux内核
要想下载2.6.29内核,只要最后执行一下(进入下载后的目录):
git checkout remotes/origin/archive/android-2.6.29 (即上面列出的版本分支)
此时下载到的是2.6.29版本内核了
六.如何获得Android某个版本的源码
例如获得Android1.5的源码
repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake
repo sync
Android 1.5:Cupcake(杯子蛋糕)
Android 1.6:Donut(甜甜圈)
Android 2.0 / 2.1:Eclair(闪电泡芙)
Android 2.2:Froyo(冷冻忧格)
Android 3.0:Gingerbread(姜饼)
Android 3.5:Honeycomb(蜂巢)
Android 4.0:Ice Cream(冰淇淋)
本质上:
想取某个branch而不是主线上的代码,我们需要用-b参数制定branch名字
七.如何获取Android当前主干上最新版本的所有的sourcecode
repoinit-ugit://android.git.kernel.org/platform/manifest.git
八.如何获取需要某一个project的代码
比如kernel/common,就不需要repo了,直接用Git即可
gitclonegit://android.git.kernel.org/kernel/common.git
九.列出本地所有分支
git branch
十.如何获取某个branch的代码
如果需要某个branch的代码,用git checkout即可。
比如我们刚刚获取了kernel/common的代码,那就先进入到common目录,然后用下面的命令:
gitcheckoutorigin/android-goldfish-2.6.27-bgoldfish
这样我们就在本地建立了一个名为goldfish的android-goldfish-2.6.27分支,代码则已经与android-goldgish-2.6.27同步。
http://www.cnblogs.com/qiengo/archive/2012/07/16/2593234.html
更多相关文章
- Android(安卓)Matrix
- Android之Adapter用法总结
- 安卓学习资料推荐
- android 三种定位方式
- [004] 详解Windows平台搭建Androiod开发环境
- Android(安卓)init进程——源码分析
- 一看就懂的Android(安卓)APP开发入门教程
- Android(安卓)屏幕适配
- 浅入浅出 Android(安卓)安全:第二章 Android(安卓)Linux 内核层安