1、环境搭建
vmware+Fedora
2、创建一个Hello文件
[root@localhost ~]# mkdir Hello
3、在Hello里面创建 hello.c 和 Makefile 两个文本文件
(1):创建hello.c
[root@localhost Hello]# vim hello.c
hello.c:
#include <linux/init.h> #include <linux/module.h>
#include <linux/kernel.h> # 后来加的
#include <linux/configfs.h> # 后来加的
MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_EMERG "hello module!\n"); return 0; } static void hello_exit(void) { printk(KERN_EMERG "bye module!\n"); } module_init(hello_init); module_exit(hello_exit);
// "GPL" 是指明了 这是GNU General Public License的任意版本 // “GPL v2” 是指明 这仅声明为GPL的第二版本 // "GPL and addtional" // "Dual BSD/GPL" // "Dual MPL/GPL" // "Proprietary" 私有的 // 除非你的模块显式地声明一个开源版本,否则内核会默认你这是一个私有的模块(Proprietary)。
(2):创建Makefile
[root@localhost Hello]# vim Makefile
Makefile:
obj-m := hello.o KERNELDR := /usr/src/kernels/2.6.32-358.el6.i686 PWD := $(shell pwd) modules: $(MAKE) -C $(KERNELDR) M=$(PWD) modules clean: rm -rf *.o
(3)make编译:
(4)加载模块
[root@localhost Hello]# insmod hello.ko
(5)卸载模块
[root@localhost Hello]# rmmod hello.ko
(6)列出模块
[root@localhost Hello]# lsmod
出现错误:
make编译的时候可能会出现下面的错误:
[root@localhost Desktop]# make make -C /usr/src/kernels/2.6.32-358.el6.i686 M=/root/Desktop modules make[1]: Entering directory `/usr/src/kernels/2.6.32-358.el6.i686' make[2]: *** No rule to make target `/root/Desktop/hell.c', needed by `/root/Desktop/hell.o'. Stop. make[1]: ***
[_module_/root/Desktop] Error 2
向内核插入新模块时,出现了File exists错误,说明模块名称有冲突,
解决措施:
最后将模块相关的c代码文件名改掉,更新Makefile中的 obj-m := xxx.o
例如:文件名hello.c 更改成 hello.c
然后更改Makefile文件内容:
编译模块,insmod 成功。