我在这里列出我的问题.
我有一个谷歌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 …Run Code Online (Sandbox Code Playgroud) 我按照论坛中的步骤(http://www.schaeuffelhut.de/wordpress/?p=237&cpage=1#comment-384)获取Linux内核源代码并交叉编译我的模块.google nexus one的内核版本与论坛中的版本完全相同.我最初测试了我的测试模块hello-1.ko,它已成功安装在Android设备上.但是当我使用insmod在Android设备上安装我的模块ec.ko时,我收到以下错误.
apurva @ apurva-Inspiron-1464:〜/ $ adb shell
$ cd sdcard/data/ec
$ ls
ec.ko
$ su
#insmod ec.ko
insmod:init_module'ec.ko'失败(没有这样的文件或目录)
#
很明显,文件ec.ko存在.但我不确定为什么不挑选文件.我为hello-1.ko做了同样的事情,它得到insmod非常好.没有权限问题,ec.ko获得了与hello-1.ko相同的权限.
现在这让我想到一个问题,Android设备中是否存在内核模块的某些限制,因为该模块在Ubuntu中获得了insmod.对我来说,下一步是采用命中和试用方法,并检查ec.c中的哪些行导致了问题.同时如果你有什么建议,请告诉我.