说明
本文记录如何创建和编译一个内核模块,以及加载和卸载内核模块。为《操作系统概念(第九版)》第二章,关于“Linux内核模块”的练习题。
创建内核模块
注:我这里是基于阿里云的轻量应用服务器(即当前博客服务器)
-
首先SSH进入到自己的服务器,然后新建一个“kernel”目录,用于存放模块相关的文件
-
然后新建一个“example.c”文件,并将下面的代码复制到文件中
vim example.c
example.c的具体内容如下:
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>/* This function is called when the module is loaded. */
int example_init(void)
{printk(KERN_INFO "Loading example module\n");return 0;
}/* This function is called when the module is removed. */
void example_exit(void)
{printk(KERN_INFO "Removing example module\n");
}/* Macros for registering module entry and exit points */
module_init(example_init);
module_exit(example_exit);/* 许可,描述和作者信息 */
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("EXAMPLE MODULE");
MODULE_AUTHOR("GENE");
创建编译文件Makefile
- 创建一个文件“Mkefile”,然后文件具体内容如下:
KVERS = $(shell uname -r)# 生成模块名(和上面一步创建的C文件名称对应)
MODULE_NAME := example# 源文件目录(因为我的Makefile文件与C文件在同目录,所以这里值为空)
SRC_PATH :=# 作为一个模块进行编译(作为一个模块进行编译时,值为m)
CONFIG_RUNYEE_CAMVIB=m# Kernel modules
obj-$(CONFIG_RUNYEE_CAMVIB) := $(SRC_PATH)$(MODULE_NAME).o# 指定模块的一些编译选项
EXTRA_CFLAGS=-g -O0build: kernel_modules
kernel_modules:make -C /lib/modules/$(KVERS)/build SUBDIRS=$(CURDIR) modules
clean:make -C /lib/modules/$(KVERS)/build SUBDIRS=$(CURDIR) clean
编译内核模块
- 执行make命令,然后可以得到一系列编译后的文件,其中“example.ko”即为编译后的内核模块
make
加载和卸载内核模块
- 在加载内核模块之前,可以输入“lsmod”命令查看当前已经加载的内核模块
lsmod
- 加载内核模块:
insmod example.ko
- 加载完成之后,可以查看已加载的内核模块,也可以输入“dmesg”命令查看打印到内核日志缓冲区的消息
dmesg
- 最后,可以卸载内核模块
rmmod example