经过一周多的努力,终于在安卓模拟器上成功运行了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