【发布时间】:2011-02-01 16:55:09
【问题描述】:
我想为 android 制作一个动态加载的内核模块。 我不想安装linux,我只有cygwin和android NDK。
【问题讨论】:
-
因为 linux 没有内核 ABI,所以你必须为每个单独的内核编译模块。 .
-
我可以从root手机中的应用程序加载LKM,以干扰系统调用。有什么想法吗?
标签: android android-ndk
我想为 android 制作一个动态加载的内核模块。 我不想安装linux,我只有cygwin和android NDK。
【问题讨论】:
标签: android android-ndk
是的,可以使用 NDK 构建内核模块。请注意,这在 Linux 系统上效果最好(我听说 Linux x86_64 是受支持的环境),因为在区分大小写的文件系统(例如 Windows 和 Mac 系统上默认提供的文件系统)上交叉编译内核代码更加困难,并且因为构建内核模块需要构建 ELF 操作二进制文件 (modpost),这需要 ELF 标头通常仅存在于 Linux 上。 那就是……
首先,您需要将源代码获取到设备上完全相同的内核,并确保配置与您的设备相同。 (否则你可能会混淆构建系统)
其次,您需要确定交叉编译器工具链在 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命令中看到的一样。当内核构建时,gcc和ld等命令都会以这个前缀。注意,如果你正在为 x86 平台构建,我希望你必须调整这些。我只为 ARM 构建了模块。)
接下来,您应该编译内核。 (为此,我从我的 Android 设备中拉下 /proc/config.gz,在内核源目录中运行 zcat config.gz > .config,然后运行 make menuconfig && make。)内核构建专家可能知道一些快捷方式,但我无法设置在不进行实际构建的情况下正确启动内核源目录以构建模块。 (如果构建树中的内核与您的设备匹配,则您不必实际更新内核,只需插入模块即可。)
最后,我使用正常流程从源代码构建内核模块。通常内核模块将有一个参数化的构建,它将以某种方式读取内核源代码树目录,然后调用构建。此时,只要正确设置了内核源代码树并设置了ARCH 和CROSS_COMPILE,您的模块就应该构建了!
祝你好运。我确定每个设备存在一些差异。
【讨论】:
关注URL,Android 开发人员建议为此使用虚拟 Ubuntu 映像,而不是 cygwin。
【讨论】: