我正在为 Linux 内核编写一个模块。当这个模块准备就绪时,我希望它可以在任何运行内核的设备中运行。
如何在 Android 手机上测试它?我是否需要重新编译带有模块的手机的整个树来测试它?如果是这样,我该怎么做?有某种insmod
适用于 Android 的吗?
答案1
是的,Android 当然有,insmod
因为 Android 基于普通的 Linux 内核。这个问题的答案与任何其他 Linux 内核的答案相同。
而且就像任何其他交叉编译情况一样,您需要根据设备上的内核源代码和内核选项以及正确的系统架构来编译模块。这因设备、制造商、ROM 等的不同而有很大差异。
您的“我该怎么做”问题是无法回答的,因为您没有提供有关设备、内核版本、ROM 或开发环境的任何详细信息。
我会认真地质疑你是否走在正确的道路上。您不能简单地编写一个模块并“在任何设备上运行它”。模块取决于内核版本和体系结构。大多数设备都被锁定,因此您无法访问根文件系统,更不用说内核了。分发这样的东西通常意味着将其捆绑到您自己的特定设备的 ROM 中。
通常,您需要编写内核模块的唯一原因是支持某些特定的硬件功能,在这种情况下,这个问题似乎是您从错误的方向开始的。另一种可能性是你想要作恶并做 Linux 通常不允许你做的事情。不要那样做。
答案2
Android 和其他 Linux 平台没有根本区别。要构建模块,您需要内核头文件和内核编译期间生成的一些文件。这些文件取决于内核配置。典型的 Linux 发行版附带一个包含这些内核头文件和其他文件的包,以便更轻松地构建自定义模块。我不认为Android NDK附带内核头文件(与编写原生应用程序的人数相比,构建内核模块的人很少,而且很多都是硬件制造商无论如何都在构建自己的系统映像)。
所以得到安卓源码,具体来说核树 ( kernel/common
)。获取您的目标设备的内核配置;默认镜像在 中提供了其配置/proc/config.gz
,您可以通过 获取它adb shell 'gzip -d </proc/config.gz'
。
获得源代码树和配置文件后,请按照通常的练习操作:将配置文件复制到.config
内核树中,运行make oldconfig
和make modules_prepare
,然后make M=/path/to/your/module/tree
构建模块。这Linux 内核模块编程指南和Linux 设备驱动程序是很好的参考;内核构建系统记录在Documentation/kbuild/modules.txt
。
如果您的目标设备没有启用模块(CONFIG_MODULES
在配置文件中),您需要使用模块重建内核并将其复制到系统映像中。
模拟器中的 Android 映像附带了非常基本的模块实用程序:insmod
、lsmod
和rmmod
,但insmod
无法指定参数。如果这是一个问题,请获取忙碌盒(它对于其他事情也很有用)。您可以从市场获取它或从源代码编译它。
有很多关于 Android 内核和模块编译的教程。这里有一些;我只是浏览了一下,所以不保证质量。