假设源码编译已经完成,并且能执行emulator -image system.img -data userdata.img -ramdisk ramdisk.img 启动模拟器。
1、下载android goldfish内核,我的android源码版本为4.0.3,但是模拟器跑起来显示的内核版本是2.6.29而不是3.x,先不管这个,就下载2.6.29的goldfish吧。
cd ~/soft/kernel
git clone <a target=_blank href="http://android.googlesource.com/kernel/goldfish.git">http://android.googlesource.com/kernel/goldfish.git</a>
cd goldfish
<span><span>git branch -a </span></span>
git checkout remotes/origin/android-goldfish-2.6.29
2、编译内核
设置交叉编译环境变量:
export PATH=$ANDROID_DIR/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH
修改Makefile文件
vi Makefile #修改ARCH和CROSS_COMPILE
193 ARCH ?= arm
194 CROSS_COMPILE ?= arm-eabi-
编译内核
make goldfish_armv7_defconfig
make
3、运行模拟器
export PATH=$ANDROID_DIR/out/host/linux-x86/bin:$PATH
emulator -image system.img -data userdata.img -ramdisk ramdisk.img -kernel /home/micky/kernel/goldfish/arch/arm/boot/zImage
4、测试驱动程序
test.c
#include <linux/init.h>
#include <linux/module.h>
static int __init test_init(void)
{
printk(KERN_ALERT "%s %d\n", __func__, __LINE__);
return 0;
}
static void __exit test_exit(void)
{
printk(KERN_ALERT "%s %d\n", __func__, __LINE__);
}
module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");
Makefile
obj-m := test.o
KERN := /home/micky/soft/kernel/goldfish/
PWD :=$(shell pwd)
ARCH=arm
CROSS_COMPILE=arm-eabi-
CC=$(CROSS_COMPILE)gcc
LD=$(CROSS_COMPILE)ld
all:
$(MAKE) -C $(KERN) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) modules
adb push *.ko /data/local/
clean:
-rm -rf *.o *.ko *.mod.c .*.cmd *.order *.symvers .tmpversions
执行make编译后会自动拷贝test.ko到Android模拟器的文件目录/data/local/下。
在pc终端执行adb shell进入android终端,然后执行
cd /data/local
insmod test.ko //控制台会打test_init方法里的印信息
rmmod test.ko //控制test_exit方法里的信息
注: a、如果rmmod报错:rmmod: delete_module failed (errno 38)
这个是内核没有配置以下几个选项,重新make menuconfig配置。
CONFIG_MODULES=y
CONFIG_MODULE_FORCE_LOAD=y
CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_FORCE_UNLOAD=y
b、如果控制台没有显示打印消息,则可以在android shell终端上执行如下命令查看:
cat /proc/kmsg 或直接运行 dmesg
c、 如果编译出现如下错误,请make menuconfig 选上 enable loadable module suppot
test.mod.c:8: error: variable '__this_module' has initializer but incomplete type
test.mod.c:9: error: unknown field 'name' specified in initializer
5、用程序测试
涉及到用程序测试可以使用模块编译方式将命令编译出来,再adb push 到模拟器文件系统
编译命令方式,请转http://blog.csdn.net/liuhongwei123888/article/details/7833620