在Android内核中加载内核模块

use*_*784 12 android android-source

我在这里列出我的问题.

我有一个谷歌Nexus手机,也就是"激情"手机.手机中安装了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
Run Code Online (Sandbox Code Playgroud)

现在这不能生成新的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
Run Code Online (Sandbox Code Playgroud)

但是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");
}
Run Code Online (Sandbox Code Playgroud)

2)

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

执行此操作后,我的内核模块应该能够控制Android手机的wnic(无线网络接口设备).它应该能够将wnic置于睡眠模式,然后在从我的内核模块接收命令后将其唤醒.如果您对如何执行此操作有一些指示,那将是一个帮助.我发现在Android上它是通过wpa_supplicant私有驱动程序控制的.命令,如:

wpa_cli driver powermode 0 - auto 
wpa_cli driver powermode 1 - active
Run Code Online (Sandbox Code Playgroud)

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

请仔细研究并提供一些帮助/指导.

谢谢,

Apurva

dtu*_*ene 5

内核模块(KO)比静态内核更容易使用 - 只要内核启用它们.最简单的方法是做一个"adb shell lsmod".其次是查看内核.config是否启用了CONFIG_MODULES = y和CONFIG_MODULE_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
Run Code Online (Sandbox Code Playgroud)