一个HelloWorld的简单内核模块例子
注:编译驱动的条件:
1、交叉工具链
2、内核源码包(驱动的版本和内核源码的版本一致)
3、源码包需要配置编译过
注:如需要帮助,可以参考内核源码中modules.txt文件(内核源码树/Documentation/kbuild/modules.txt)
编写模块的注意事项:
1.模块运行需要初始化及退出。
module_init(test_init);
module_exit(test_exit);
2. 实现初始化及退出接口。
例:
//模块初始化 static int test_init(void) { printk(" hello World!\n "); return 0; } //模块退出 static void test_exit(void) { printk(" good bye!\n "); }
3) 添加必要的头文件
#include <linux/kernel.h>
#include <linux/module.h>
4) 添加需要的版权声明
MODULE_LICENSE("GPL");
5) 编写Makefile
KDIR = /home/gec/build_kernel/android-kernel-samsung-dev //指定模块服务的内核的源码目录(该内核需要经过编译) obj-m += module_test.o //指定生成模块文件 all: make -C $(KDIR) M=`pwd` modules //编译规则
6) make 编译
7) 下载运行
module_test.c文件:
#include <linux/kernel.h>
#include <linux/module.h>
//模块初始化
static int test_init(void)
{
printk(" hello World!\n ");
return 0;
}
//模块退出
static void test_exit(void)
{
printk(" good bye!\n ");
}
MODULE_LICENSE("GPL");
module_init(test_init);
module_exit(test_exit);
Makefile文件:
KDIR = /home/gec/build_kernel/android-kernel-samsung-dev //指定模块服务的内核的源码目录(该内核需要经过编译)
obj-m += module_test.o //指定生成模块文件
all:
make -C $(KDIR) M=`pwd` modules // -C表示指定Makefile文件,这里指定为内核源码树顶层Makefile文件 M参数传入当前文件路径
常用命令:
lsmod 检查模块的转载记录
insmod 装载模块
rmmod 卸载模块
注:
卸载模块时
出现内核模块管理警告:
rmmod: chdir(2.6.35.7): No such file or directory ---> 内核默认的模块存放目录 --->
解决方法:
创建对应内核版本的模块目录 -----> mkdir /lib/modules/2.6.35.7
注:
1.查看模块的信息
$ modinfo hello.ko
filename: hello.ko
license: GPL
description: the test of module
author: drm@GEC
depends:
vermagic: 2.6.35.7 preempt mod_unload ARMv7
2.安装
# insmod *.ko
3.卸载
#rmmod *
4.查看已经安装的模块
#lsmod