所谓内核模块是Linux内核向外部提供的一个接口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),简称模块。
一个模块程序的结构:
--模块加载函数(必须有)
--模块卸载函数(必须有)
--模块许可证声明(必须有)
--模块参数(可选)
--模块到处符号(可选)
--模块作者,版本等信息声明(可选)
也就是说一个最简单的模块必须包含三部分,如何编写一个模块,让我们从一个简单的例子开始吧:Hello World(基本上每个资料都是从它开始)。
//开始
#include
#include
static int hello_init(void) //static 可以不要,此函数为模块的入口点
{
printk(KERN_ALERT "hello_world enter\n");
return 0;
}
static void hello_exit(void) //出口函数,当模块卸载时会调用它
{
printk(KERN_ALERT "hello world exit\n");
} //无需返回
module_init(hello_init);
//宏调用,#define module_init(x) _initcall(x);
//见内核源码:
module_exit(hello_exit);//同样为宏调用
MODULE_LICENSE("Dual BSD/GPL");//许可证声明
//可选项,作者名字
MODULE_AUTHOR("YOUR NAME");
//结束
一个简单的模块代码结束了。然后在为其编写一个Makefile,注意这里必须是Makefile!而不是makefile
Makefile 文件如下:
# Makefile 2.6
obj-m += hello.o
KDIR:=/usr/src/$(shell uname -r)
all:
make -C $(KDIR) M=$(PWD)modules
#结束
obj-m := hello.o表示编译后生成hello.o模块。
$(KDIR) 指定了内核源码的路径,“M=”表示这是个外部模块,M=$(PWD)modules 指定了该模块文件所在的路径。
注: Makefile预定义了$(PWD)变量(# PWD=$(shell pwd)),此处可以不必重复定义。
到此为至条件已经成熟,就差编译了,编译过程如下:
$make
$sudo insmod hello.ko //加载
(注意这里是:hello.ko 虽然你写的是hello.o )
$sudo rmmod hello.ko //卸载
阅读(1564) | 评论(1) | 转发(0) |