我在這裏列出我的問題。在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