宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

经过一周多的努力,终于在安卓模拟器上成功运行了netfilter示例whoVisit.ko

首先准备条件:

安装git 版本管理软件)

安卓开发环境eclipse、jdk、sdk )

总之,在这个过程中,他提示了你减少了什么,所以你通过sudo apt-get install xxx安装什么? 经常使用制表符完成功能。 )

ps:如果您不太清楚这一点,请不要跳过并执行步骤。

目录:

为android模拟器下载内核源代码,代号goldfish

下载arm-linux交叉工具链

3 .编译内核文件

4 .用刚刚编译的内核运行安卓仿真器

5 .编译自己的世卫组织visit.ko内核模块

将世卫组织visit.ko加载到内核中

7 .下载已编译内核仅限android仿真器)和编译时下载config文件

请注明出处。 http://blog.csdn.net/fdl 19881/article/details/7467129

为android模拟器下载内核源代码,代号goldfish

goldfish内核仅用于android模拟器。)

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

$mkdir android-kernel #创建此目录

$ CD安卓- kernel

$ git clone https://Android.Google source.com/kernel/goldfish.git

$cd goldfish

$git branch -a #查看所有版本

* 无分支) )。

大师

远程/原始/头原始/主

remotes/origin/Android-goldfish-2.6.29

远程/原始/主

$ gitcheckoutremotes/origin/Android-GoldFish-2.6.29 #这是goldfish内核下载

至此,您已经下载并完成了android模拟器专用的内核源。 文件夹为:~~/Android-Kernel/GoldFish

下载arm-linux交叉工具链

ps:的工具链目录为: ~/android-toolchain/

注意:最好按照以下步骤安装工具链。 否则,稍后编译. ko可能会出现问题。 我一直在用NDK里面的工具链,结果. ko的编译失败了。

$mkdir ~/android-toolchain

$cd ~/android-toolchain

在$ git clone https://Android.Google source.com/platform/pre built #步骤中,下载约1.8GB。

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

添加到最后一行:

导出路径=’/home/XXX/Android-toolchain/pre built/Linux-x86/toolchain/arm-eabi-4.4.3 /端庄的秋日3360

然后注销,登录后生效。 或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补充) )

然后,请选择启用可加载模块支持项目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_funcunsigned 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_hdrsb);pr_warning”Packet from %d.%d.%d.%d to %d.%d.%d.%d\n”,NIPQUADiph->saddr), NIPQUADiph->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/goldfishPWD :=$shell pwd)ARCH=armCROSS_COMPILE=arm-eabi-CC=$CROSS_COMPILE)gccLD=$CROSS_COMPILE)ldobj-m := whoVisit.omodules:$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