一个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

posted @ 2014-10-14 22:44  Achille·Swn  阅读(2280)  评论(0编辑  收藏  举报