您的位置:首页 > 移动开发 > Android开发

ubuntu11.10下为android模拟器编译内核到为android开发内核模块(.ko文件)全过程纪实

2012-09-26 15:03 591 查看
转自http://blog.csdn.net/fdl19881/article/details/7467129

首先准备条件:

安装git (版本管理软件)

android开发环境 (eclipse , jdk , sdk )

总之,在这个过程中,他提示你少了什么,那么你就通过sudo apt-get install xxx安装什么 (多用Tab键补全功能)

ps:如果你不是太懂这个,请按照步骤一步步的来,不要跳过。

目录:

1. 下载android 模拟器所用的内核源码, 代号为goldfish

2. 下载arm-linux交叉工具链

3. 编译内核文件

4. 让android模拟器运行在刚编译的内核上

5. 编译自己的whoVisit.ko内核模块

6 将whoVisit.ko载入到内核中

7. 编译好的内核下载(android模拟器专用) 和 编译时用的config文件 下载

转载请注明出处:http://blog.csdn.net/fdl19881/article/details/7467129

1. 下载android 模拟器所用的内核源码, 代号为goldfish

(goldfish内核是专为android模拟器使用的)

ps:假设我们在~/android-kernel目录下下载android内核文件

$mkdir android-kernel #创建此目录

$cd android-kernel

$git clone https://android.googlesource.com/kernel/goldfish.git
$cd goldfish

$git branch -a #查看全部的版本

* (no branch)

master

remotes/origin/HEAD -> origin/master

remotes/origin/android-goldfish-2.6.29

remotes/origin/master

$git checkout remotes/origin/android-goldfish-2.6.29 #这部就是下载goldfish内核

到此下载android 模拟器专用的内核源码完成 , 所在文件夹为: ~/android-kernel/goldfish

2. 下载arm-linux交叉工具链

(ps: 假设工具链的目录为: ~/android-toolchain/)

注意: 最好是用下面的步骤安装工具链, 否则后面编译.ko可能会出问题. 我当时一直用NDK里面的工具链,结果编译.ko老是失败!!

$mkdir ~/android-toolchain

$cd ~/android-toolchain

$git clone https://android.googlesource.com/platform/prebuilt #这一步,要下载近1.8GB。

然后将此路径加入PATH变量中, 修改~/.profile文件

在最后一行加入:

export PATH="/home/xxx/android-toolchain/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH"

然后注销,再登陆就生效了。 (或者source ~/.profile , 不懂的就注销)

到此arm-linux交叉编译工具链就弄好了。

3. 编译内核文件

ps: 为了让内核文件支持动态加载和卸载.ko模块,请大家按下面的步骤进行

$cd ~/android-kernel/goldfish

$export ARCH=arm

$export SUBARCH=arm

$export CROSS_COMPILE=arm-eabi- #前面已经将路径加入到PATH变量中了

$make goldfish_defconfig

为了支持动态加载和卸载ko模块,否则请跳过。

$make menuconfig #这步可能会提示缺少个什么库 , 用sudo apt-get install libxxx安装 (多按Tab补全)

然后请把Enable loadable module support项按y选上

然后按回车进入选上三项,如图:





如果想使用netfilter,请把

Networking support -> Networking options -> Network packet filtering framework (Netfilter)这些选上

下面开始编译内核

$make -j8 #-j8表示并行编译数,即8个进程并行编译,更快

到此支持loadable 的内核编译完成 , 编译后的内核为 ./arch/arm/boot/zImage

4. 让android模拟器运行在刚编译的内核上

4.1 打开eclipse -> window -> ***D manager 新建一个模拟器,比如名叫avd2.1 (此步的前提是你已经装好了android开发环境)

4.2 使用自己的内核运行

(假设你的android sdk已经安装 , 这里使用 ANDROID_SDK表示android sdk安装目录)

$ $ANDROID_SDK/tools/emulator -avd avd2.1 -kernel ~/android-kernel/goldfish/arch/arm/boot/zImage -show-kernel

到此运行成功!

5. 编译自己的whoVisit.ko内核模块

假设文件位置在~/src中

源码whoVisit.c

[cpp] view
plaincopy

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/skbuff.h>

#include <linux/ip.h>

#include <linux/netfilter.h>

#include <linux/netfilter_ipv4.h>

#include <linux/netdevice.h>



MODULE_LICENSE("GPL");



/* This is the structure we shall use to register our function */

static struct nf_hook_ops nfho;



/* This is the hook function itself */

unsigned int hook_func(unsigned int hooknum,

struct sk_buff *skb,

const struct net_device *in,

const struct net_device *out,

int (*okfn)(struct sk_buff *))

{

struct sk_buff *sb = skb;

struct iphdr *iph;

iph = ip_hdr(sb);

pr_warning("Packet from %d.%d.%d.%d to %d.%d.%d.%d\n",NIPQUAD(iph->saddr), NIPQUAD(iph->daddr));

return NF_ACCEPT;

}



/* Initialisation routine */

int init_module()

{

/* Fill in our hook structure */

nfho.hook = hook_func; /* Handler function */

nfho.hooknum = NF_INET_PRE_ROUTING; /* First hook for IPv4 */

nfho.pf = PF_INET;

nfho.priority = NF_IP_PRI_FIRST; /* Make our function first */

nf_register_hook(&nfho);

pr_info("whoVisit install into kernel!/n");

return 0;

}

/* Cleanup routine */

void cleanup_module()

{

nf_unregister_hook(&nfho);

pr_info("whoVisit removed from kernel!/n");

}

Makefile文件:

[python] view
plaincopy

KERNELDIR := /home/xxx/android-kernel/goldfish

PWD :=$(shell pwd)

ARCH=arm

CROSS_COMPILE=arm-eabi-

CC=$(CROSS_COMPILE)gcc

LD=$(CROSS_COMPILE)ld

obj-m := whoVisit.o

modules:

$(MAKE) -C $(KERNELDIR) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) modules

然后输入make (请保证内核编译前选择了netfilter 和loadable那几个选项后的)

就成功了! 或者你可以找网上更简单的hello.ko的例子(不需要netfilter)!

6 将whoVisit.ko载入到内核中

先按照第4步运行模拟器

$cd ~/src

$adb push whoVisit.ko /data

$adb shell

#cd data

#insmod whoVisit.ko

然后看看第4步中运行的shell里的输出情况是不是有from <IP> to <IP>

这就说明成功了!

7. 编译好的内核下载(android模拟器专用)

下载地址:http://download.csdn.net/detail/fdl19881/4252901

kernel文件名为zImage418.bak

用法见第四步。

编译时的配置文件为config418.bak

用法:

1.准备好我在第一、二章。

2. 将此文件改名为 .config 放到goldfish内核源码根目录

3. 然后make menuconfig (如果你还要在调整下配置的话,否则跳过)

4. 编译 make -j10 . 完成生成zImage文件就是内核文件了, 用法见第四章

这个过程不懂的,可以跟帖问。 其他的我估计也不懂了。。

参考资料:
http://source.android.com/source/building-kernels.html http://www.52rd.com/Blog/Detail_RD.Blog_bajie22_30194.html http://www.cnblogs.com/mengshu-lbq/archive/2011/01/19/1939011.html http://blog.csdn.net/quaful/article/details/6053708
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐