Keep on going, never give up.

Android内核模块开发实例

做Android开发时常需要添加自己的内核模块,比如虚拟网卡、声卡或是字符设备等,本文示例添加简单的Hello模块过程,供入门参考。

一、把Hello模块添加进系统内核

1、创建模块文件

示例在driver/char/下建立hellomod文件夹,然后在hellomod文件夹下建立hello.c文件,内容如下:

#include <linux/module.h>  
#include <linux/init.h>  

MODULE_LICENSE("GPL");  
static int __init hello_init(void)  {  
    printk(KERN_ERR "Hello world init\n");  
    return 0;  
}  

static void __exit hello_exit(void)  {  
    printk(KERN_ERR "Hello world exit\n");  
} 

module_init(hello_init);  
module_exit(hello_exit);  

2、创建Makefile

Makefile有两个,一个是Hellomod文件夹下的Makefile,另一个是/driver/char下的,

前者内容如下:

obj-y := hello.o

在driver/char下,编辑Makefile,加入:

obj-y   += hellomod/

重新编译内核可直接将hellomod模块编译到内核,启动后可以看到上文printk打印的启动信息,说明模块加载成功。

二、动态加载hello.ko

上文方式是直接把模块编译进了系统内核,当然测试阶段,我们还可以设计为动态加载方式,那么只需把Makefile略加修改。

1、修改hellomod/Makefile文件

obj-m := hellomod.o        
hellomod-objs := hello.o

KERNELDIR :=~/android/android-kernel/goldfish
PWD := $(shell pwd)
ARCH=arm
CROSS_COMPILE=arm-eabi-
CC=$(CROSS_COMPILE)gcc
LD=$(CROSS_COMPILE)ld

all:
make -C $(KERNELDIR) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=${PWD} modules

clean: 
rm -rf *.o .cmd *.ko *.mod.c .tmp_versions

重新make后,将hellomod.ko用adb push到/data/

2、安装hello模块

到/data/目录下,命令行下执行:

insmod hellomod.ko

通过命令:

cat /var/log/messages

或,cat /proc/kmsg

可以看到下面这样的信息:“Hello world init”,说明模块加载成功了。

3、卸载hello模块

命令行下执行命令:

rmmod hello.ko

通过命令:

cat /var/log/messages

可以看到下面这样的信息:“Hello world exit”,说明模块卸载成功。

参考资料:

http://blog.csdn.net/jiankangshiye/article/details/6665179

http://blog.csdn.net/fdl19881/article/details/7467129

相关评论(0):  

发表评论:

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

订阅博客

最新文章

本站采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载也必须遵循“署名-非商业用途-保持一致”的创作共用协议. 返回顶部
Copyright@2005-2016 Metsky.com, All rights Reserved.