2011-02-01 61 views
4

我想为android制作一个动态加载的内核模块。 我不想安装一个linux,我只是有cygwin和android NDK。android NDK可以编译内核模块的源码吗?

+0

由于linux没有内核ABI,因此您必须将模块编译到每个单独的内核。 。 – lovespring 2011-02-05 15:26:00

+0

我可以在固定电话的应用程序中加载LKM,以干扰系统调用。有任何想法吗? – DroidBot 2013-01-18 09:14:57

回答

1

刚才我发现this URL用户试图加载LKM并成功,虽然在Android(内核核心:2.6.29),我认为它是在Linux上,而不是在Cygwin上。希望你也能得到它!

还有一个资源herehere too

一切顺利!

0

按照这个URL,Android开发人员建议为这个虚拟Ubuntu镜像比cygwin。

3

是的,可以使用NDK构建内核模块。请注意,这对于Linux系统(我被告知Linux x86_64是支持的环境)效果最好,因为交叉编译区分大小写的文件系统上的内核代码(例如Windows和Mac系统上默认出现的代码)很难,因为构建内核模块需要构建ELF操作二进制文件(modpost),这些二进制文件通常只在Linux上存在,这需要ELF头文件。 这就是说...

首先,您需要将源代码获取到设备上相同的内核,并确保配置与您的设备相同。 (否则有可能会混淆构建系统)

其次,您需要确定交叉编译器工具链在Android NDK中的位置。以下是我找到了我:

$ cd $NDK_HOME 
$ find . | grep '\-gcc$' 
./toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin/arm-eabi-gcc 
./toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc 

(注意,$NDK_HOME是我安装了Android NDK)

第三,你需要添加$NDK_HOME/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin目录(或者是任何一个是你的系统)到您的PATH环境变量。

然后,你需要导出两个环境变量:

export ARCH=arm 
export CROSS_COMPILE=arm-eabi- 

(注意,该arm-eabi-前缀是一样的就是我们在find命令当内核是建立看到,命令如gccld注意,如果你正在构建一个x86平台,我期望你将不得不调整这些,我只为ARM构建了模块。)

接下来,你应该编译内核。 (为此,我从我的Android设备上拉下了/proc/config.gz,在内核源代码目录中运行zcat config.gz > .config,然后运行make menuconfig && make。)内核构建大师在这里可能会知道一些快捷方式,但我无法正确设置内核源代码目录用于构建模块而不进行实际构建。 (如果您的构建树中的内核与您的设备匹配,则不必实际更新内核,只需插入模块。)

最后,我使用正常流程从源代码构建内核模块。通常,内核模块将具有参数化版本,该版本将以某种方式读入内核源码树目录,然后调用版本。此时,只要内核源代码树设置正确,并且设置了ARCHCROSS_COMPILE,则应该创建模块!

祝你好运。我确定每个设备都有一些差异。