前面已经讲了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即可,结果如下:

https://imagehyj.oss-cn-hangzhou.aliyuncs.com/blog/202408072213263.png

插入

sudo insmod [xxx.ko]

查看

  • 第一是如何查看内核日志
dmesg

https://imagehyj.oss-cn-hangzhou.aliyuncs.com/blog/202408072215414.png

由于我们刚刚插入了一个模块,所以看到了最下面插入时打印的消息。

  • 第二是查看内核已经加载的模块
lsmod

https://imagehyj.oss-cn-hangzhou.aliyuncs.com/blog/202408072216346.png

这里可以看到所有已经被插入的模块。

删除

运行:

sudo rmmod xxx

即可将模块从内核中移除,移除后可以运行dmesg查看日志,查看效果如下:

https://imagehyj.oss-cn-hangzhou.aliyuncs.com/blog/202408072219892.png