我在虚拟机中安装了ubuntu10.10, 32位系统,从google code上http://code.google.com/p/android/downloads/list下载了android内核源码linux-2.6.25-android-1.0_r1.tar.gz,贴两张截图:
1,因为后面要进行make menuconfig,所以执行以下命令安装相关软件包:
sudo apt-get install libscurses*
2, 解压缩,现在通过vm tool或者共享文件的方式将内核文件拷贝到虚拟机中的ubuntu系统中,解压:
tar zxvf linux-2.6.25-android-1.0_r1.tar.gz
会生成一个kernel.git目录
3, 我们可以自己通过menuconfig配置android内核,但因为我们通常会使用android sdk编程,里面自带了模拟器,也就有了一个完整的可运行内核,也就有一个好的内核配置文件,所以我在虚拟机中安装了myeclipse8.0, 然后再myeclipse中搭建了android开发环境,并创建了模拟器android1.5,使用的是1.5的API;此时,我们可以在android的sdk目录下,tools中通过./emulator -avd android1.5 启动模拟器,在platform-tools中使用./adb shell,并执行cat /proc/version查看当前内核版本,我的是:
# cat /proc/version
Linux version 2.6.27-00110-g132305e (mikechan@cheetara.corp.google.com) (gcc version 4.2.1) #6 Mon Feb 2 12:47:38 PST 2009
4, 当模拟器运行时,我们可以使用./adb pull /proc/config.gz将该配置文件从模拟器中pull出来,在platform-tools中,
cp config.gz ~/kernel.git/ 拷贝到内核解压目录
gunzip config.gz 解压该配置文件,生成config
mv config config.gz 将config改名为config.gz
5, 安装交叉编译环境,这里我们使用已有的交叉编译工具Code Sourcery,到该网站下载:
http://www.codesourcery.com/sgpp/lite/arm/portal/release1600
注意选择版本,我下载的是arm ia32 gun/linux安装文件版,下载下来直接运行安装:
修改文件权限:
sudo chmod u+x arm-2010.09-50-arm-none-linux-gnueabi.bin
sudo dpkg-reconfigure -plow dash
安装选项。install as /bin/sh? 选择NO
./arm-2010.09-50-arm-none-linux-gnueabi.bin
安装完成,直接在命令行输入arm狂敲tab键,如果出现arm-none-linux-gnueabi-g++,就表示安装完成,若出现错误,请参照该网站提供的get-start文档安装。
6, 修改内核源码根目录的Makefile文件:
修改CROSS_COMPILE= arm-eabi-
为CROSS_COMPILE = arm-none-linux-gnueabi-
修改LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,
$(call ld-option, -Wl$(comma)–build-id,))
为#LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,
#$(call ld-option, -Wl$(comma)–build-id,))
#LDFLAGS_BUILD_ID =
这一部的解释如下:
把它注释掉的原因是目前android的内核还不支持这个选项。–build-id选项,主要是用于在生成的elf可执行文件中加入一个内置的id,这样在core
dump,或者debuginfo的时候就可以很快定位这个模块是哪次build的时候弄出来的。这样就可以避免,每次都把整个文件做一遍效验,然后才能得到该文件的是由哪次build产生的。对于内核开发者来说,这是很不错的想法,可以节约定位模块版本和其影响的时间。目前,该功能还出于early
stage的状态,未来的android或许会支持,但至少目前的版本是不支持的。如果不注释掉,编译出来的内核有4.3M大,且模拟器无法加载。
在此,要感谢两篇博客:
http://www.williamhua.com/2009/04/30/how-to-build-android-15-kernel-image/
和
陈罡的博客(从他们的博客上可以很容易知道如何通过git工具下载android内核源码,并编译的步骤)
7, 配置内核,make menuconfig,进去之后选择默认并保存退出就OK了,注意这一步的虚拟机屏幕最好调整成自适应。
8, 编译内核,make。
9,关闭刚才打开的模拟器,重新使用我们编译的内核来运行该模拟器,在tools目录下:
./emulator -avd android1.5 -kernel ~/kernel.git/arch/arm/boot/zImage -show-kernel
-kernel 是加载新内核, -show-kernel是显示内核加载信息,我的运行信息如下:
$ ./emulator -avd android1.5 -kernel ~/share/kernel.git/arch/arm/boot/zImage -show-kernel
emulator: emulator window was out of view and was recentred
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00093177
Machine: Goldfish
Memory policy: ECC disabled, Data cache writeback
CPU0: D VIVT write-through cache
CPU0: I cache: 4096 bytes, associativity 4, 32 byte lines, 32 sets
CPU0: D cache: 65536 bytes, associativity 4, 32 byte lines, 512 sets
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 24384
Kernel command line: qemu=1 console=ttyS0 android.checkjni=1 android.qemud=ttyS1 ndns=2
Unknown boot option `android.checkjni=1': ignoring
Unknown boot option `android.qemud=ttyS1': ignoring
PID hash table entries: 512 (order: 9, 2048 bytes)
Console: colour dummy device 80x30
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 96MB = 96MB total
Memory: 94328KB available (2320K code, 442K data, 96K init)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
net_namespace: 152 bytes
NET: Registered protocol family 16
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 4096 (order: 3, 32768 bytes)
TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
TCP reno registered
checking if image is initramfs... it is
Freeing initrd memory: 142K
goldfish_new_pdev goldfish_interrupt_controller at ff000000 irq -1
goldfish_new_pdev goldfish_device_bus at ff001000 irq 1
goldfish_new_pdev goldfish_timer at ff003000 irq 3
goldfish_new_pdev goldfish_rtc at ff010000 irq 10
goldfish_new_pdev goldfish_tty at ff002000 irq 4
goldfish_new_pdev goldfish_tty at ff011000 irq 11
goldfish_new_pdev smc91x at ff012000 irq 12
goldfish_new_pdev goldfish_fb at ff013000 irq 13
goldfish_new_pdev goldfish_audio at ff004000 irq 14
goldfish_new_pdev goldfish_memlog at ff006000 irq -1
goldfish_new_pdev goldfish-battery at ff014000 irq 15
goldfish_new_pdev goldfish_events at ff015000 irq 16
goldfish_new_pdev goldfish_nand at ff016000 irq -1
goldfish_new_pdev goldfish-switch at ff017000 irq 17
goldfish_new_pdev goldfish-switch at ff018000 irq 18
goldfish_pdev_worker registered goldfish-switch
goldfish_pdev_worker registered goldfish-switch
goldfish_pdev_worker registered goldfish_nand
goldfish_pdev_worker registered goldfish_events
goldfish_pdev_worker registered goldfish-battery
goldfish_pdev_worker registered goldfish_memlog
goldfish_audio_probe
goldfish_pdev_worker registered goldfish_audio
goldfish_pdev_worker registered goldfish_fb
goldfish_pdev_worker registered smc91x
goldfish_pdev_worker registered goldfish_tty
goldfish_pdev_worker registered goldfish_tty
goldfish_pdev_worker registered goldfish_rtc
ashmem: initialized
goldfish_pdev_worker registered goldfish_timer
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
yaffs Apr 6 2011 19:30:05 Installing.
io scheduler noop registered
io scheduler anticipatory registered (default)
io scheduler deadline registered
io scheduler cfq registered
goldfish_pdev_worker registered goldfish_device_bus
allocating frame buffer 320 * 480, got ffc10000
goldfish_pdev_worker registered goldfish_interrupt_controller
Console: switching to colour frame buffer device 40x30
console [ttyS0] enabled
loop: module loaded
nbd: registered device at major 43
smc91x.c: v1.1, sep 22 2004 by Nicolas Pitre <nico@cam.org>
No IRQF_TRIGGER set_type function for IRQ 12 (goldfish)
eth0: Ethernet addr: 52:54:00:12:34:56
goldfish nand dev0: size 4000000, page 2048, extra 64, erase 131072
goldfish nand dev1: size 4000000, page 2048, extra 64, erase 131072
goldfish nand dev2: size 4000000, page 2048, extra 64, erase 131072
mice: PS/2 mouse device common for all mice
*** events probe ***
events_probe() addr=0xc6804000 irq=16
events_probe() keymap=qwerty2
input: qwerty2 as /devices/virtual/input/input0
goldfish_rtc goldfish_rtc: rtc core: registered goldfish_rtc as rtc0
logger: created 64K log 'log_main'
logger: created 64K log 'log_events'
logger: created 64K log 'log_radio'
IPv4 over IPv4 tunneling driver
TCP cubic registered
NET: Registered protocol family 1
NET: Registered protocol family 17
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
802.1Q VLAN Support v1.8 Ben Greear <greearb@candelatech.com>
All bugs added by David S. Miller <davem@redhat.com>
VFP support v0.3: implementor 41 architecture 1 part 10 variant 9 rev 0
goldfish_rtc goldfish_rtc: setting system clock to 2011-04-06 11:58:55 UTC (1302091135)
Freeing init memory: 96K
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.0, "mtdblock0"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.1, "mtdblock1"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.2, "mtdblock2"
sh: can't access tty; job control turned off
# init: cannot find '/system/bin/playmp3', disabling 'bootsound'
init: cannot find '/system/bin/dbus-daemon', disabling 'dbus'
init: sys_prop: mis-match msg size recieved: -1 expected: 128
,此时我们进入到模拟器的shell中
在platform-tools中./adb shell
cat /proc/version
我的信息显示如下:
# cat /proc/version
Linux version 2.6.25 (ydp@ydp-desktop) (gcc version 4.5.1 (Sourcery G++ Lite 2010.09-50) ) #1 Wed Apr 6 19:33:51 CST 2011
表示我的内核已经不是默认的(用于1.5的模拟器的),而是我刚刚编译的内核(1.0模拟器的)
至此,android内核编译完成,而且可以从模拟器中看到新内核所运行的android系统了。
注意网上有很多android内核编译的文章,大家都编译的比较新的内核,使用git工具获取android内核源码(google在2.6.25也就是android1.0之前都把源码放在google code之上也就是本文下载源码的地方,在1.0之后将源码由git仓库统一管理,从git仓库下载源码非常耗时,不适合第一次编译内核的人,一般人都是下班前开始下载,第二天上班的时候可能才下载完成,另外,我在编译的时候也遇到了很多问题,比我我一开始下载的2.6.23的源码,不知道为什么启动模拟器之后,android系统并未启动,另外,我一开始的ubuntu系统是64位的,这也给我带来了很多麻烦)
10, 既然编译了android内核,可以顺便利用之前安装的交叉编译工具链,来编一个简单的c程序,在android中运行:
#include <stdio.h>
int main(void)
{
printf("I'm a java developer!\n");
return 0;
}
命名hello.c
编译:arm-none-linux-gnueabi-gcc hello.c -o hello -static
注意一定要加-static选项
在./adb push hello /data/将编译好的hello文件push到android系统中,生成的hello在ubuntu中是不能运行的
进入到./adb shell,到/data目录,执行./hello此时就可以看到运行结果了:
I'm a java developer!
*不好意思,不知道为什么不能插入图片,文章暂时不提供截图
联系我,请yuanyu5237@sina.com
分享到:
相关推荐
Ubuntu10.10编译Linux内核 Ubuntu10.10编译Linux内核 Ubuntu10.10编译Linux内核
如果显示当前系统版本为 Linux 3.0.8,则系统内核编译成功。 本实验报告指导用户在 Ubuntu 10.10 操作系统环境下编译 Linux 3.0.8 内核版本,提供了详细的实验步骤和命令,用户可以根据实验报告一步步进行实验,...
写了一份Ubuntu10.10上搭建Android2.2基于ARM的交叉编译环境的文档,供那些对搭建Android 2.2交叉编译环境的人还很陌生的人作为参考。 注:由于疏忽,请把本文档第6页的“(3)配置环境变量”这一项中的"export JRE...
Ubuntu10.10(64位)编译Android2.3源码 遇到的错误
经过个人实践,包括内核下载和安装gcc,make等工具的介绍,以及从内核的下载到编译到安装过程,不错的教程哦
Ubuntu 10.10 下 TFTP 服务器配置笔记 本文档介绍了在 Ubuntu 10.10 操作系统下如何配置 TFTP 服务器,从虚拟机网络配置到 TFTP 服务器的搭建,旨在帮助读者快速搭建 TFTP 服务器。 一、虚拟机网络配置 在 Ubuntu...
Ubuntu 10.10在2010年10月正式发布,让众多Ubuntu用户都对这款全新的系统充满期望。毕竟,Ubuntu 10.10是Canonical公司推出的最为用户友好的系统,而且为它添加了很多新的功能。 熟悉Ubuntu系统的用户了解,在...
Ubuntu10.10下kgdb环境搭建
用Ubuntu10.10 dvd版本作为本地源,Ubuntu 10.10 DVD ISO挂载的方式来更新软件,已经通过测试
Ubuntu10.10下嵌入式开发环境的配置
windows_XP下安装Ubuntu10.10
在U盘中安装Ubuntu 10.10的方法
ubuntu 10.10网络配置10步曲
U盘安装ubuntu10.10图文教程
Ubuntu 10.10的安装图解过程Ubuntu 10.10的安装图解过程
Ubuntu 10.10安装配置tftp服务.doc
ubuntu10.10安装配置全过程图文详解
Ubuntu 10.10下建立嵌入式初级开发环境
ubuntu10.10下安装Samba步骤,个人实践记载所得。
本文档就cuda和mpi在ubuntu10.10下的安装与配置进行了较为详细的说明,按照此文档安装,ubuntu 10.10下99%会安装正确。通过安装SSH可实现多台机器的无密码访问...ubuntu下其它版本安装可能稍有不同,但绝大部分是相同的