在经过重新编译的goldfish内核上,已经运行了安卓模拟器,正在动态添加自己编译的内核。
一开始的时候我从网上找了个hello.c文件,按照他的方式写了Makefile文件,但是当运行命令insmod的时候,会报错:
insmod: init_module 'hello.ko' failed (Exec format error)
期间,查了好多资料依然没有解决,然后又重新按照这篇博客的方式试了一下,竟然成功了,连接地址:http://blog.csdn.net/yf210yf/article/details/9901375
下面我把他的Makefie文件贴出来,hello.c文件没有问题,问题就出在Makefile上,按照他的方式写Makefile,便可以动态插入自己编译的内核了。下面贴代码:
obj-m := hello-yf.o
hello-yf-objs := hello.o
KID :=~/android-kernel/goldfish
PWD := $(shell pwd)
ARCH=arm
CROSS_COMPILE=arm-eabi-
CC=$(CROSS_COMPILE)gcc
LD=$(CROSS_COMPILE)ld
all:
make -C $(KID) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=${PWD} modules
clean:
rm -rf *.o .cmd *.ko *.mod.c .tmp_versions
但是,我现在不知道为什么他这样写是正确的,我在研究研究。等把原理弄清楚了,在更新这篇博客,不过这个问题已经解决了。
我大概明白是为什么了,大家看这个代码:
all:
make -C $(KID) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=${PWD} modules
我觉得这段代码是解决这个问题的关键,首先通过make -C $(KID),将当前的goldfish内核源码的本地路径指定为编译环境,然后分别给ARCH 和交叉编译的环境变量分别赋值,这样的话就不会在出现上面的问题了。如果大家想要自己编译自己的内核按照,这种方式去写makefile文件的话,应该是没有问题的。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在更新一下,“M=”选项的作用是,当用户需要以某个内核为基础编译一个外部模块的话,需要在make modules 命令中加入“M=dir”,程序会自动到你所指定的dir目录中查找模块源码,将其编译,生成KO文件。这样一来生成的ko文件才能动态插入到内核中。