当前位置: 首页 > 工具软件 > Fish Sync > 使用案例 >

Android之Goldfish

宗政权
2023-12-01

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

repo init -u git://android.git.kernel.org/platform/manifest.git

 

八.如何获取需要某一个project的代码

比如kernel/common,就不需要repo了,直接用Git即可

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

九.列出本地所有分支 

git branch

十.如何获取某个branch的代码

如果需要某个branch的代码,用git checkout即可。

 

比如我们刚刚获取了kernel/common的代码,那就先进入到common目录,然后用下面的命令:

git checkout origin/android-goldfish-2.6.27 -b goldfish  

这样我们就在本地建立了一个名为goldfish的android-goldfish-2.6.27分支,代码则已经与android-goldgish-2.6.27同步。


http://www.cnblogs.com/qiengo/archive/2012/07/16/2593234.html
















 类似资料: