经过1个多星期的努力,终于成功在android模拟器运行了一个netfilter的例子whoVisit.ko

首先准备条件:

安装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 -> AVD 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

#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文件:

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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐