现在的位置: 首页 > 综合 > 正文

一个简单的Linux内核模块实现

2013年03月02日 ⁄ 综合 ⁄ 共 1328字 ⁄ 字号 评论关闭

    参考了《Linux 设备驱动开发详解》 和 《Linux 驱动程序(第三版)》及网上资料。虽说简单,但对第一次操作整个过程却也出了不少的麻烦。下面按照我的思路来重现整个过程:

1.一个简单的Linux 内核模块 原始代码:hello.c

#include <linux/init.h>                                      //include head files

#include <linux/module.h>

MODULE_LICENSE("DUAL BSD/GPL");  //告诉内核模块的版权信息/许可权限

static int hello_init(void)                               //模块加载时执行

{

      printk(KERN_ALERT "Hello World enter the hello module/n");

      return 0;

}

static void hello_exit(void)                         //模块卸载时执行

{

     printk(KERN_ALERT "Hello World exit the hello module /n");

}

module_init(hello_init);           //模块注册

module_exit(hello_exit);

MODULE_AUTHOR("Yanhao"); //作者

MODULE_DESCRIPTION("A Simple Hello Module");    //模块描述

MODULE_ALIAS("simplest module");  //别名


Makefile:

obj-m:=hello.o

2.用准备好的交叉编译工具链来编译 生成.ko文件,然后用加载到开发板,执行。

   编译结果是有许多的符号找不到,如:KERN_ALERT.我加上了头文件也行不通。驱动三版上面说要构建相应的内核树,

才能找到相应的符号。于是第三步就有了:

3.构建内核树

何谓内核树?内核源码的一种逻辑形式。目前来看包含相应内核的头文件、宏、数据结构等等

找到相应版本的内核源码,我的为2.6.24

第一步配置:make menuconfig

第二步编译内核:make bzImage

第三步编译并安装模块:make modules /*编译模块*/ make modules_install  /*安装模块*/

如果没问题的话,在/lib/modules/ 下可以看到一个新的目录为 你的内核版本号为名字的目录 ,我的为2.6.24.

在编译时我们会用到这个目录下的 build 目录,至此,内核编译完成,内核树构建完成。

4.再次编译模块

在我们的模块源码目录下 :输入make -C /lib/modules/2.6.24(新增目录)/build M=`pwd`

如果没问题的话,会生成hello.ko。

5.实验

把hello.ko文件用tftp 传送到开发板上,执行insmod hello.ko 安装模块  终端会打印出"Hello World enter the hello module"

执行rmmod hello 卸载模块 终端打印"Hello World exit the hello module"

OK,小功告成。


抱歉!评论已关闭.