您的位置:首页 > 其它

一个HelloWorld的简单内核模块例子

2014-10-14 22:44 441 查看
注:编译驱动的条件:
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: