Android 模拟器(源码编译)测试内核驱动

时间:2013-03-14作者:klpeng分类:PHP浏览:4668评论:0

假设源码编译已经完成,并且能执行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





 



 

   

 


 

打赏
文章版权声明:除非注明,否则均为彭超的博客原创文章,转载或复制请以超链接形式并注明出处。
相关推荐

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

猜你喜欢