《深入解析Android 虚拟机》——1.4 编译Android Kernel
本节书摘来自异步社区《深入解析Android 虚拟机》一书中的第1章,第1.4节,作者:钟世礼著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.4 编译Android Kernel
编译Android Kernel代码就是编译Android内核代码,在进行具体编译工作之前,需要先了解在Android开源系统中包含的以下3部分代码。
仿真器公共代码:对应的工程名是kernel/common.get。
MSM平台的内核代码:对应的工程名是kernel/msm.get。
OMAP平台的内核代码:对应的工程名是kernel/omap.get。
在本节的内容中,将详细讲解编译上述Android Kernel的基本知识。
1.4.1 获取Goldfish内核代码
Goldfish是一种虚拟的ARM处理器,通常在Android的仿真环境中使用。在Linux的内核中,Goldfish作为ARM体系结构的一种“机器”。在Android的发展过程中,Goldfish内核的版本也从Linux 2.6.25升级到了Linux 3.4,此处理器的Linux内核和标准的Linux内核有以下3个方面的差别。
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的path值用于指定交叉编译工具的路径。
编译结果如下所示:
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处理器这类机器使用的配置宏。
在gildfish_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标准,但是和硬件平台无关。
和原Linux内核相比,Android内核增加了Android的相关驱动(Driver),对应的目录如下所示:
kernel/drivers/android
Android的相关驱动主要分为以下几类驱动。
Android IPC系统:Binder (binder.c)。
Android 日志系统:Logger (logger.c)。
Android 电源管理:Power (power.c)。
Android 闹钟管理:Alarm (alarm.c)。
Android 内存控制台:Ram_console (ram_console.c)。
Android 时钟控制的gpio:Timed_gpio (timed_gpio.c)。
对于本书讲解的驱动程序开发来说,我们比较关心的是GoldFish平台下相关的驱动文件,具体说明如下所示。
(1)字符输出设备:
kernel/drivers/char/goldfish_tty.c
(2)图象显示设备(Frame Buffer):
kernel/drivers/video/goldfishfb.c
(3)键盘输入设备文件:
kernel/drivers/input/keyboard/goldfish_events.c
(4)RTC设备(Real Time Clock)文件:
kernel/drivers/rtc/rtc-goldfish.c
(5)USB Device设备文件:
kernel/drivers/usb/gadget/android_adb.c
(6)SD卡设备文件:
kernel/drivers/mmc/host/goldfish.c
(7)FLASH设备文件:
kernel/drivers/mtd/devices/goldfish_nand.c kernel/drivers/mtd/devices/goldfish_nand_reg.h
(8)LED设备文件:
kernel/drivers/leds/ledtrig-sleep.c
(9)电源设备:
kernel/drivers/power/goldfish_battery.c
(10)音频设备:
kernel/arch/arm/mach-goldfish/audio.c
(11)电源管理:
kernel/arch/arm/mach-goldfish/pm.c
(12)时钟管理:
kernel/arch/arm/mach-goldfish/timer.c
1.4.2 获取MSM内核代码
在目前市面上,谷歌的手机产品G1是基于MSM内核的,MSM是高通公司的应用处理器,在Android代码库中公开了对应的MSM的源代码。在Android开源工程的代码仓库中,使用Git工具得到MSM内核代码的命令如下所示:
$ git clone git://android.git.kernel.org/kernel/msm.git
1.4.3 获取OMAP内核代码
OMAP是德州仪器公司的应用处理器,为Android使用的是OMAP3系列的处理器。在Android代码库中公开了对应的OMAP的源代码,使用Git工具得到OMAP内核代码的命令如下所示:
$ git clone git://android.git.kernel.org/kernel/omap.git
1.4.4 编译Android的Linux内核
了解了上述3类Android内核后,下面开始讲解编译Android内核的方法。在此以Ubuntu 8.10为例,完整编译Android内核的流程如下。
(1)构建交叉编译环境。
Android的默认硬件处理器是ARM,因此需要在自己的机器上构建交叉编译环境。交叉编译器GNU Toolchain for ARM Processors下载地址如下所示:
http://www.codesourcery.com/gnu_toolchains/arm/download.html
单击GNU/Linux对应的链接,再单击“Download Sourcery CodeBench Lite 5.1 2012.03-117”链接后直接下载,如图1-20所示。
把arm-2008q3-71-arm-none-linux-gnueabi-i686-pc-linux- gnu.tar.bz2解压到一目录下,例如“~/programes/”,并加入PATH环境变量:
vim ~/.bashrc
然后添加:
ARM_TOOLCHIAN=~/programes/arm-2008q3/bin/ export PATH=${PATH}:${ARM_TOOLCHIAN};
保存后并source ~/.bashrc。
(2)获取内核源码,源码地址如下所示:
http://code.google.com/p/android/downloads/list
选择的内核版本要与选用的模拟器版本尽量一致。下载并解压后得到kernel.git文件夹。
tar -xvf ~/download/linux-3.2.5-android-4.3_r1.tar.gz
(3)获取内核编译配置信息文件。
编译内核时需要使用configure,通常configure有很多选项,我们往往不知道需要那些选项。在运行Android模拟器时,有一个文件“/proc/config.gz”,这是当前内核的配置信息文件,把config.gz获取并解压到“kernel.git/”下,然后改名为.config。命令如下所示:
cd kernel.git/ emulator & adb pull /proc/config.gz gunzip config.gz mv config .config
(4)修改Makefile。
修改195行的代码:
CROSS_COMPILE = arm-none-linux-gnueabi-
将CROSS_COMPILE值改为arm-none-linux-gnueabi-,这是安装的交叉编译工具链的前缀,修改此处意在告诉make在编译的时候要使用该工具链。然后注释掉562和563行的如下代码:
#LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,/ # $(call ld-option, -Wl$(comma)--build-id,))
必须将上述代码中的build id 值注释掉,因为目前版本的Android内核不支持该选项。
(5)编译。
使用make进行编译,并同时生成zImage:
LD arch/arm/boot/compressed/vmlinux OBJCOPY arch/arm/boot/zImage Kernel: arch/arm/boot/zImage is ready
这样生成zImage大小为1.23 MB,android- sdk-linux_x86-4.3_r1/tools/lib/images/kernel-qemu是1.24 MB。
(6)使用模拟器加载内核测试,命令如下所示:
cd android/out/cupcake/out/target/product/generic emulator -image system.img -data userdata.img -ramdisk ramdisk.img -kernel ~/project/android/kernel.git/ arch/arm/boot/zImage &
到此为止,模拟器就加载成功了。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
《深入解析Android 虚拟机》——1.3 编译Android源码
本节书摘来自异步社区《深入解析Android 虚拟机》一书中的第1章,第1.3节,作者:钟世礼著,更多章节内容可以访问云栖社区“异步社区”公众号查看 1.3 编译Android源码 编译Android源码的方法非常简单,只需使用Android源码根目录下的Makefile,执行make命令即可轻松实现。因为Android L是一个Preview版本,官方并没有公布其完整的内核代码。所以本节中的编译内容将以正式版Android 4.3进行。当然在编译Android源码之前,首先要确定已经完成同步工作。进入Android源码目录使用make命令进行编译,使用此命令的格式如下所示: $: cd ~/Android4.3(这里的“Android4.3”就是我们下载源码的保存目录) $: make 编译Android源码可以得到“~/project/android/cupcake/out”目录,笔者的截图界面如图1-18所示。 整个编译过程也是非常漫长的,需要读者耐心等待。在本节的内容中,将详细讲解编译Android源码的基本过程。 1.3.1 搭建编译环境在编译Android源码之前,需要先进...
- 下一篇
《深入解析Android 虚拟机》——2.2 Java虚拟机概述
本节书摘来自异步社区《深入解析Android 虚拟机》一书中的第2章,第2.2节,作者:钟世礼著,更多章节内容可以访问云栖社区“异步社区”公众号查看 2.2 Java虚拟机概述 Java虚拟机(JVM)是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能模拟来实现的。Java虚拟机有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM虚拟机的运作结构如图2-1所示。 从该图中可以看到,JVM是运行在操作系统之上的,与硬件没有直接的交互。JVM的具体组成部分如图2-2所示。 (1)使用JVM的原因。 Java语言的一个非常重要的特点就是与平台的无关性。而使用JVM是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。在引入JVM后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式JVM屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在JVM上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。当JVM执行字节码时,把字节码解释成具体平台上的机器指令执行。 (2)JVM的作用。...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- 设置Eclipse缩进为4个空格,增强代码规范
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7安装Docker,走上虚拟化容器引擎之路