前面已经讲了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查看日志,查看效果如下: