我在虚拟机中安装了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下kgdb环境搭建详解 #### 前言 随着Linux操作系统在嵌入式领域的广泛应用,内核级别的调试成为了许多开发者必须掌握的一项技能。不同于用户空间的应用程序,内核级别的调试更加复杂,因为它发生在...
内核编译需要下载内核源代码,安装编译软件,解压源代码,配置内核选项、编译内核等步骤。 下载内核源代码可以从 http://www.kernel.org/ 网站下载最新版本的内核源代码。安装编译软件包括安装 make、gcc、make-...
5. **配置步骤**:在源代码目录下运行`./configure`脚本以配置Qtopia的构建环境。这里可能需要根据目标平台定制参数,例如指定交叉编译器路径。 6. **编译与链接**:配置成功后,使用`make`命令进行编译,然后使用`...
本文将详细讲解在Ubuntu 10.10环境下,如何进行Android内核源代码的交叉编译过程。 首先,为了进行Android内核的模拟器开发,需要安装Android SDK并创建Android虚拟设备(AVD)。AVD是用于模拟不同Android版本的...
根据提供的文件信息,本文将详细解释如何在Ubuntu 10.10系统上进行mtd-utils及UBIFS的交叉编译,并确保其能在Atmel AT91SAM9G45平台上顺利运行。此过程涉及多个步骤,包括所需库的编译安装以及mtd-utils的相关配置与...
在 Linux 操作系统环境下重新编译内核。实验主要内容包括: A. 查找并且下载一份内核源代码,本实验使用最新的 Linux 内核 2.6.36。 B. 配置内核。 C. 编译内核和模块。 D. 配置启动文件。 三、主要仪器设备 ...
- **版本控制系统**:讲解了如何使用版本控制系统(如Git)来管理源代码,包括创建仓库、提交更改、分支合并等操作。 #### 其他实用功能 - **GnuPG**:介绍了如何使用GnuPG工具进行加密和解密,以及如何使用它来...
将下载的`.tar.gz`内核源码文件移动到`/usr/src`目录下,使用`tar`命令解压缩,接着进入解压后的目录。使用`cp`命令复制`/boot/config-<current_kernel>`文件作为新内核的基础配置。 四、配置内核 内核配置可以通过...
在Ubuntu 10.10环境下编译Linux内核2.6.38涉及一系列步骤,需要对操作系统、内核版本、编译工具和配置选项有深入理解。以下是详细的编译流程和注意事项: 首先,确保你的环境是Pentium 4架构的Ubuntu 10.10(内核...
Linux 内核编译的过程包括下载内核源代码、配置内核、编译内核和模块、安装内核和模块、生成启动文件等步骤。 一、实验目的 本实验的目的是重新编译 Linux 内核,理解和掌握 Linux 内核和发行版本的区别。实验环境...
本实验以Ubuntu 10.10和Linux内核2.6.35为基础,目标是下载并编译内核源代码2.6.36。以下是详细的步骤: 1. **下载内核源代码**: 从官方Linux内核网站下载最新版本的源代码,例如2.6.36。这可以通过访问...
2. **移动内核源代码文件**:使用 `mv linux-2.6.36.tar.gz /usr/src` 将下载的内核源代码文件移到 `/usr/src` 目录下。 3. **解压内核包**:进入 `/usr/src` 目录,使用 `cd /usr/src`;然后执行 `tar xzf linux-...
- **Linux环境**:Ubuntu 10.10,Linux内核2.6.35。 - **待编译内核**:Linux 2.6.36。 #### 操作方法和实验步骤 1. **下载内核源代码** - **步骤**:从指定网站下载最新的Linux内核2.6.36版本。 - **注意事项**...
4. **实验环境**:本实验在Ubuntu 10.10系统环境下进行,原始内核版本为2.6.35,目标是编译升级到2.6.36版本。 5. **下载内核源代码**:从指定网站下载最新的Linux内核源代码,例如这里下载的是2.6.36版本的tar.gz...
### Android源码编译及ROM制作 #### 一、概览 在《android源码编译及rom制作.pptx》这份文档中,主要讲解了如何进行Android源码的编译以及ROM的制作过程。这一过程对于那些希望深入了解Android操作系统工作原理、...
- **放置内核源码**:将下载的内核源码放置于`/usr/src`目录下,便于后续编译操作。 #### 2. 编译内核 - **清理工作空间**:执行`make mrproper`和`make clean`命令,彻底清理内核目录下的旧文件和配置,确保编译...
实验所需的环境为Linux 2.6.26或以上版本,推荐使用Ubuntu 10.10或Redhat作为实验平台。实验步骤涵盖了从下载内核源代码、配置、编译到最终测试的全过程,每一步都需仔细操作,确保内核的稳定性和功能完整性。 通过...
配置完成后,开始编译内核,这包括`make dep`(创建依赖关系)、`make clean`(清除旧的编译文件,非必要)、`make bzImage`(编译内核镜像)以及`make modules`和`make modules_install`(编译和安装模块)。...