ubuntu11.10下为android模拟器编译内核到为android开发内核模块(.ko文件)全过程纪实
经过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
更多推荐
所有评论(0)