正在安卓内核中加载内核模块



我在这里列出了我的问题。

我随身携带一部谷歌Nexus one,也就是"激情"手机。手机中安装了Fastboot和adb工具。并且引导加载程序已解锁。

我的任务:我必须在Android内核中添加一个linux内核模块。

我所做的:

我顺着台阶进去了http://source.android.com/source/initializing.html并下载了android-2.3.6_r1(激情)的内核并构建了它。我还可以在手机上闪存它,新的android内核也很好。现在我想要的是修改内核,添加我自己的内核模块,然后在手机上闪存,这样手机上的内核就是我修改过的内核。

现在我遇到了两种方法。

1)

将我的内核模块与android内核交叉编译,并使用adb命令将其推送到设备上。我在内核中使用的Makefile如下所示。

VERSION = 2
PATCHLEVEL = 3
SUBLEVEL = 6
EXTRAVERSION = -00054-g5f01537
obj-m += hello-1.o
KDIR=/home/apurva/android_dir
PWD := $(shell pwd)
all:
        make -C $(KDIR) ARCH=arm CROSS_COMPILE=/home/apurva/android_dir/prebuilt/linux-    x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- SUBDIRS=$(PWD) modules
clean:
        make -C $(KDIR) ARCH=arm CROSS_COMPILE=/home/apurva/android_dir/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- SUBDIRS=$(PWD) clean

现在这无法生成新的hello-1.ko。我不知道为什么,我想VERSION、PATCHLEVEL、SUBLEVEL和EXTRAVERSION值有一些问题。这些必要吗?我也尝试了android-2.3.6_r1中的这些值,但仍然不起作用。我不确定这个EXTRAVERSION值是多少?

我甚至在我的ubuntu中尝试了编译器生成的hello-1.ko。我用下面的adb命令将这个hello-1.ko推送到模拟器中。

/root/bin/src/out/host/linux-x86/bin/adb shell mount
/root/bin/src/out/host/linux-x86/bin/adb push hello-1.ko /data
/root/bin/src/out/host/linux-x86/bin/adb insmod /data/hello-1.ko

但是hello-1.ko无法insmod,我得到了以下错误。insmod:init_module()中的错误hello-1.ko函数未实现

而hello-1.c非常简单:

#include <linux/module.h>       /* Needed by all modules */
#include <linux/kernel.h>       /* Needed for KERN_INFO */
int init_module(void)
{
        printk(KERN_INFO "Hello world 1.n");
        return 0;
}
void cleanup_module(void)
{
    printk(KERN_INFO "Goodbye world 1.n");
}

2)

第二种方法是将内核模块的源文件放在android的内核目录中。可能在系统目录或其他地方,并要求make与其他源一起构建这些源文件。但我不确定在哪里要求make进程这样做。我尝试在main.mk中这样做,并在我的源文件的源目录中创建了一个Android.mk文件,但没有成功。也许这是一个更好的解决方案,但我找不到任何帮助。

完成后,我的内核模块应该能够控制android手机的wnic(无线网络接口设备)。它应该能够将wnic置于睡眠模式,然后在收到来自我的内核模块的命令后将其唤醒。如果你有一些关于如何做到这一点的建议,那将是一个帮助。我发现在安卓系统上,它是通过wpa_pplient私有驱动程序控制的。命令,如:

wpa_cli driver powermode 0 - auto 
wpa_cli driver powermode 1 - active

可以完成我的任务,但我不确定,因为我没有尝试过。我还没有达到那个阶段。

请对此进行调查并提供一些帮助/指导。

谢谢,

Apurva

内核模块(KO)比静态内核更容易使用,只要内核启用了它们。最简单的方法是做一个"adb shell lsmod"。第二个是查看kernel.config是否启用了config_MODULES=y和config_MOD ULE_UNLOAD=y。网上有很多关于linux KO开发的信息。

嗯,你很接近,但看起来makefile很古怪。首先尝试在您的主机上构建hello KO进行单元测试,然后在您的目标上构建。以下是我在运行姜饼的OMAP36xx上使用的示例makefile:

# Makefile for trivial android kernel module
obj-m += mod_hello.o
CROSS_COMPILE=/opt/distros/ARM/bin/arm-none-linux-gnueabi-
TARG_KDIR ?= /opt/android/dal/nook_kernel
HOST_KDIR=/lib/modules/$(shell uname -r)/build
# target creates:
#  .<obj>.o: CC command line for the .o, including dependencies
#  .<obj>.mod.o.cmd: CC command line for the mod.o, including dependencies
#  .<obj>.ko.cmd: LD command line which links the .o and .mod.o to create the .ko
target:
    @echo "Make module for target arm"
    make -C $(TARG_KDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) modules
host:
    @echo "Make module for host"
    make -C $(HOST_KDIR) M=$(PWD) modules
clean:
    @echo "cleaning target"
    make -C $(TARG_KDIR) M=$(PWD) clean
    @echo "cleaning host"
    make -C $(HOST_KDIR) M=$(PWD) clean

首先在.config中检查是否启用了模块支持。(CONFIG_MODULES=y和CONFIG_MMODULE_UNLOAD=y),如果不使用菜单配置启用它们。

然后将您的模块放在内核源的根上,并将其添加到您在根中找到的主makefile中

core-y      := usr/ yourModule/

并将其发送到您的模块文件夹makefile

obj-m := yourModule.o

最新更新