1、简单的helloword代码如下所示:
- #include <linux/init.h>
- #include <linux/module.h>
- MODULE_LICENSE("Dual BSD/GPL");
- static int hello_init(void){
- printk(KERN_ALERT "Hello, world\n");
- return 0;
- }
- static int hello_exit(void){
- printk(KERN_ALERT "Goodbye,cruel world\n");
- return 0;
- }
- module_init(hello_init);
- module_exit(hello_exit);
2、hello_init函数是用来初始化模块的,用module_init(hello_init)来设置,同理module_exit(hello_exit)是退出时做一些清理工作的
3、编译该内核模块
1) 内核模块里用到的函数以及符号都是来自内核源码的,所以编译的时候需要有一份内核源码,在上下载,解压即可;
2) 直接编译
编写Makefile文件
3)
make -C /usr/src/linux/ SUBDIRS=$PWD modules 这时,当前目录下会生成hello.mod.c hello.o modules.order
hello.ko hello.mod.o Makefile Module.symvers,多个文件,其中hello.ko就是生成的内核模块
如果这步出错,请参考http://blog.csdn.net/sabalol/article/details/2076610
4)将模块加入到内核中
sudo insmod hello.ko
这时候报错:insmod: error inserting 'hello.ko': -1 Invalid module format
运行dmesg,可以看到这样的一行: hello: disagrees about version of symbol module_layout
使用
- make -C /lib/modules/`uname -r`/build M=`pwd` modules
重新make,再sudo insmod hello.ko,没有报错
5)查看信息,运行dmesg可以看到这样的一条输出
[11104.240469] Hello, world
6)移除hello.ko
sudo rmmod hello.ko
再次运行dmesg,可以看到
[11211.257349] Goodbye,cruel world
阅读(1300) | 评论(1) | 转发(0) |