您的位置:首页 > 运维架构 > Linux

Linux驱动部分-(一)内核模块的编写

2015-11-20 15:59 603 查看

Linux驱动部分-内核模块编写

模块需要生成节点并链入设备链表,必须包含模块初始化函数、模块销毁函数

用module_init用来声明初始化函数

用module_exit用来声明销毁函数

用MODULE_LICENSE声明模块许可信息,可识别许可有:

"GPL"(适用于GNU通用公共许可的任何版本)

"GPL and additional rights"

eg:简单内核模块

1)编写内核模块
/*************************************************************/

//simple_demo.c

#include<linux/kernel.h> //printk声明的头文件

#include<linux/init.h> //module_init和module_exit声明的头文件

#include<linux/module.h> //所有模块驱动程序必须包括头文件

static int simple_init(void) //模块初始化函数,模块加载时调用的函数

{

printk("--------hello world!\n");

return 0;

}

static void simple_exit(void) //模块销毁函数

{

printk("---------hello goodbye!\n");

}

module_init(simple_init); //module_init用来声明初始化函数

module_exit(simple_exit); //module_exit用来声明销毁函数

MODULE_LICENSE("GPL");

/*************************************************************/

2)编译内核模块
内核的编译必须依赖源码树,否则无法编译内核模块

编写Makefile文件

eg:Makefile编写

obj-m:=simple.o

simple-objs:=simple_demo.obj-m

KDIR:=/lib/modules/2.6.18-8.el5/build

PWD:=$(shell pwd)

default:

make -C $(KDIR)M=$(PWD) modules

clean:

rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order

运行:

make

生成的模块为 hello.ko

/**注意**/

ps:文件名通常是大写M

$@ 目标文件

$< 第一个依赖文件

$^ 所有的依赖文件

3)驱动模块的加载与卸载
insmod simple.ko 加载模块

rmmod simple 卸载模块

cat /var/log/messages | grep'hello' 查看模块加载和卸载的情况
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: