一个内核模块至少包括两个函数:初始化函数init_module,在模块被插入到内核时使用;清除函数cleanup_module,在模块被从内核中移走时使用。一般情况下函数init_module或者在内核中注册一个处理程序,或者使用自己的代码替换一个内核函数,函数cleanup_module则清除init_module所做的任何事情,这样模块就可以安全的卸载。
下面来一个最简单的helloworld。总共有两个文件:helloworld.c和Makefile
c文件:helloworld.c
#include </linux/kernel.h>
#include </linux/module.h>
int init_module()
{
printk("this is kernel speaking");
return 0;
}
void cleanup_module()
{
printk("clean module success");
}
在这里要注意linux/module.h文件并非在用户空间,而是在/usr/src/linuxekernel/include下面,linuxkernel是你以自己的内核版本号命名的内核头文件目录,我的是linux-headers-2.6.32-21。这个helloworld没有做什么实质的工作。
makefile文件:Makefile
obj-m := helloworld.o
KERNELBUILD := /lib/modules/`uname -r`/build
all:
make -C $(KERNELBUILD) M=$(shell pwd) modules
clean:
rm -rf *.o *.ko *.mod.c .tmp_versions modules* Module*
接下来开始编译,执行命令make,然后ls,会发现多了很多*.o文件;
然后安装模块,命令sudo insmod helloworld,在这里helloworld是我们的模块名,这里需要root权限。
查看模块是否安装成功,可以使用命令lsmod,该命令会显示系统内所有的模块。还可以查看文件/proc/modules。
卸载模块 sudo rmmod helloworld.