前面已经讲了Linux模块的基本知识,现在我们来熟悉一下模块相关的基本操作。
模块的编写
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
// 插入内核时的函数
static int __init lnm_init(void) {
printk("hello world kernel.\n");
return 0;
}
// 退出内核的函数
static void __exit lnm_exit(void) {
printk("Goodbye kernel.\n");
}
// 将模块插入内核
module_init(lnm_init);
module_exit(lnm_exit);
MODULE_LICENSE("GPL");
上面就是一个最简单的内核模块,当插入的时候会打印
hello world kernel.
退出内核时会打印Goobye kernel.
。现在我们需要为他编写Makefile。
obj-m:=vm.o
# 当前目录
CURRENT_PATH:=$(shell pwd)
# linux内核版本
LINUX_KERNEL:=$(shell uname -r)
# linux内核头文件目录
LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
编译 插入 查看 删除
编译
make
直接运行make即可,结果如下:
插入
sudo insmod [xxx.ko]
查看
- 第一是如何查看内核日志
dmesg
由于我们刚刚插入了一个模块,所以看到了最下面插入时打印的消息。
- 第二是查看内核已经加载的模块
lsmod
这里可以看到所有已经被插入的模块。
删除
运行:
sudo rmmod xxx
即可将模块从内核中移除,移除后可以运行dmesg
查看日志,查看效果如下: