在RHEL6.0 x86_64系统上实现完成内核模块的编译、插入、删除。
以下是我的第一个模块的程序:
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/init.h>
- char *name=NULL;
- module_param(name,charp,S_IRUGO);
- static int __init hello_init(void)
- {
- printk("----%s\n", name);
- printk("<1>Hello, I come!....\n");
- return 0;
- }
- static void __exit hello_exit(void)
- {
- printk("<1>GoodBye, I go!....\n");
- }
- module_init(hello_init);
- module_exit(hello_exit);
- MODULE_LICENSE("GPL");
该模块在插入的时候可以传递参数 ,不想传参数仅需注释
- char *name=NULL;
- module_param(name,charp,S_IRUGO);
- printk("----%s\n", name);
要注意添加MODULE_LICENSE
("GPL"),否则编译回报错编写相应的Makefile文件,这个文件名是固定的。
- obj-m := hello.o
- CURRENT_PATH := $(shell pwd)
- LINUX_KERNEL := $(shell uname -r)
- LINUX_KERNEL_PATH := /usr/src/kernels/$(LINUX_KERNEL)
- all:
- make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
- clean:
- make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
要严格注意格式,否则很容易出错,make之前是一个空格
第一行指定内核模块的名称
第二行指出生成模块的位置
第三行找到内核所处的位置
接下来就可以通过make命令运行Makefile文件,若没有报错则会生成很多文件,其中hello.ko就是目标模块
插入模块必须有root权限,所以以root身份运行
#insmod hello.ko name=linux
没有任何显示,则插入成功,此模块要传参数,因此后面多了"name=linux",若无参,则省掉
可以在/var/log/message里查看模块插入模块的输出信息
也可已通过lsmod | grep hello查看刚插入的模块,可以在插入前,插入后,删除后分别执行,结果会更清楚
删除模块同样方便,以root身份运行
# rmmod hello
查看删除模块的输出信息
阅读(812) | 评论(0) | 转发(0) |