Chinaunix首页 | 论坛 | 博客
  • 博客访问: 226166
  • 博文数量: 29
  • 博客积分: 1477
  • 博客等级: 上尉
  • 技术积分: 451
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-06 14:48
文章分类
文章存档

2012年(1)

2011年(14)

2010年(14)

我的朋友

分类: 嵌入式

2010-12-22 22:19:50

编译Android的Linux内核实践

DanielWood 20100927
 

和标准的Linux开发流程一样,Android平台开发的一个很重要的基础工作就是对其内核的编译和移植。本文结合Android的开发文档以及本人的实践经验,简单介绍了Android内核的编译过程,希望有助于对内核移植感兴趣的开发人员。

Android作为Google公司推出的一款手机开发平台,其本身是基于linux内核的。Google提供的内核源代码中除了linux部分外,有很大一部分是与虚拟处理器Qemu和模拟硬件平台Goldfish相关的。所以如果想将Android移植到实际的硬件平台上需要将这部分代码剥离出来。当然这不是这篇文章的重点,我们现在的目的是要编译出一个可以在模拟器上运行的系统内核,那么,现在就开始我们的工作吧。[1]

工作环境及所需软件包

系统环境:Ubuntu 8.04.4 LTS

交叉编译器:GNU Toolchain for ARM Processors

下载地址:

其中第一项选择ARM EABIARM GNU/Linux,第二项选择IA32 GNU/Linux TAR(直接解压的)即可。

Android内核源代码:linux-2.6.23-android-m5-rc14.tar.gz

下载地址:

1.      搭建交叉编译环境

1) 安装Android SDK:在这里主要的用途是从模拟器中提取配置文件.config,这个和编译标准Linux内核相同,以及运行编译好的Linux内核。我用的是自己的Android源代码下的模拟器,所以这一步省去。

2) 安装交叉编译器:将arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 解压,并把它目录下的bin目录放到PATH参数中。可以用export命令,我用的是直接修改.bashrc文件,在文件中添加

export PATH=$PATH:/media/disk/arm-2010q1/bin

ps:我的解压目录是/media/disk/

3) 解压缩内核源代码:将linux-2.6.25-android-1.0_r1.tar.gz解压。

2.      获取内核编译配置文件

交叉编译环境搭建好后需要得到android的内核编译参数的配置文件,该文件需要从android的模拟器中得到。启动android模拟器,然后通过adb得到模拟器中提供的内核配置文件:adb pull /proc/config.gz

这时候adb工具会连接模拟器,并从它里面下载一个叫做config.gz的文件到你的当前目录下。将其移动至kernel目录,解压该文件得到config,将其重命名为.config,这样就可以跳过make config而直接得到Makefile所需要的内核配置文件。  

gunzip config.gz

 mv config .config

3      修改Makefile

Makefile文件在kernel.git文件目录下。

首先修改195行(可能由于版本的不同,行数会不同),将CROSS_COMPILE值改为arm-none-linux-gnueabi-,这是我们安装的交叉编译工具链的前缀,修改此处意在告诉make在编译的时候要使用该工具链。

然后修改第562-563行,将BUILD_ID值注释掉,因为据说目前版本的android内核不支持该选项。

 

4.      开始编译

kernel.git目录下执行make

make完以后在arch/arm/boot会产生一个zImage

的镜像文件。

5.      运行该镜像

用命令emulator -kernel  /media/disk/kernel.git/arch/arm/boot/zImage指定模拟器的内核。

运行了刚刚编译的Linux内核镜像,不过从感觉不出有什么差别,如何才能清楚地知道运行的是自己编译的镜像呢。

刚刚网上搜了下,原来有方法的:

http://blog.chinaunix.net/u/26691/showart_468007.html

而且感觉这篇日志是鼻祖,后来的貌似都是借鉴/实践他的。

启动模拟器后,用adb shell,然后cd proc目录,用命令cat version可以打印除kernel的信息。

Linux version 2.6.25 (daniel) (gcc version 4.4.1 (Sourcery G++ Lite 2010q1-202) ) #1 Mon Sep 27 11:02:58 CST 2010

然后再开一个原先用的模拟器,打印出它的内核信息:


Linux version 2.6.29-00177-g24ee4d2 (veenstra@jackv.mtv.corp.google.com) (gcc version 4.4.0 (GCC) ) #21 Thu Aug 6 20:39:45 PDT 2009

发现它们的cpu信息也不同了。

cat cpuinfo


原先的cpuinfo
Processor    : ARM926EJ-S rev 5 (v5l)
BogoMIPS    : 400.58
Features    : swp half thumb fastmult vfp edsp java
CPU implementer    : 0x41
CPU architecture: 5TEJ
CPU variant    : 0x0
CPU part    : 0x926
CPU revision    : 5

Hardware    : Goldfish
Revision    : 0000
Serial        : 0000000000000000



编译后kernel的cpuinfo
Processor    : ARM926EJ-S rev 5 (v5l)
BogoMIPS    : 413.69
Features    : swp half thumb fastmult vfp edsp java
CPU implementer    : 0x41
CPU architecture: 5TEJ
CPU variant    : 0x0
CPU part    : 0x926
CPU revision    : 5
Cache type    : write-through
Cache clean    : not required
Cache lockdown    : not supported
Cache format    : Harvard
I size        : 4096
I assoc        : 4
I line length    : 32
I sets        : 32
D size        : 65536
D assoc        : 4
D line length    : 32
D sets        : 512

Hardware    : Goldfish
Revision    : 0000
Serial        : 0000000000000000


参考文献:
[1]
阅读(2277) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~