2012-02-24 183 views
12

我在這裏列出我的問題。在Android內核中加載內核模塊

我有一臺Google Nexus one a.k.a.「激情」手機。 Fastboot和adb工具安裝在手機中。引導裝載程序解鎖。

我的任務:我必須添加一個Linux內核模塊到Android內核。

我做了什麼:

我跟着http://source.android.com/source/initializing.html步驟和下載的內核爲Android-2.3.6_r1(激情),並建立了它。我也能夠在手機上刷新它,新的android內核也能正常工作。現在我想要修改內核並添加自己的內核模塊,然後在手機上進行閃存,以便手機上的內核是我的修改內核。

現在我遇到了兩種方法來做到這一點。

1)

交叉編譯我的內核模塊的Android內核,並推動它與亞行命令的設備上。我在內核中使用的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的內核目錄中。可能在系統目錄或其他地方,並要求製作這些源文件以及其他來源。但我不確定在哪裏詢問製作過程。我試圖在main.mk中這樣做,並在我的源文件的源代碼目錄中創建了一個Android.mk文件,但它不起作用。可能這是一個更好的解決方案,但我找不到任何幫助。

做完這些之後,我的內核模塊應該能夠控制android手機的wnic(無線網絡接口設備)。它應該能夠將wnic置於睡眠模式,然後在接收到來自內核模塊的命令後將其喚醒。如果你對如何做到這一點有一些指導,那將是一個幫助。我發現在Android上它是通過wpa_supplicant專用驅動程序進行控制的。命令,如:

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

可以做我的任務,但我不知道,因爲我沒有嘗試過。我還沒有達到那個階段。

請仔細檢查並提供一些幫助/指導。

感謝,

Apurva

回答

5

內核模塊(高)更容易一起工作不是靜態的內核 - 只要內核,使他們。最簡單的方法是做一個「adb shell lsmod」。其次是看內核.config是否啓用了CONFIG_MODULES = y和CONFIG_MODULE_UNLOAD = y。關於linux KO開發的大量信息。

嗡嗡聲,你很近,但它看起來像生成文件扭曲。首先嚐試在你的主機上建立你好KO進行單元測試,然後建立你的目標。下面是一個示例生成文件我上OMAP36xx運行薑餅使用:

# 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 
1

在.config首先檢查該模塊支持已啓用。 (CONFIG_MODULES = y和CONFIG_MODULE_UNLOAD = y)如果不使用menuconfig啓用它們。

然後放在內核源代碼的根你的模塊和它添加到您找到根

core-y  := usr/ yourModule/ 

主要makefile文件,這給yourModule文件夾的Makefile

obj-m := yourModule.o