操作系统练习:创建内核模块,并加载和卸载模块

说明

本文记录如何创建和编译一个内核模块,以及加载和卸载内核模块。为《操作系统概念(第九版)》第二章,关于“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 -O0

build: 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

file

加载和卸载内核模块

  • 在加载内核模块之前,可以输入“lsmod”命令查看当前已经加载的内核模块
lsmod
  • 加载内核模块:
insmod example.ko
  • 加载完成之后,可以查看已加载的内核模块,也可以输入“dmesg”命令查看打印到内核日志缓冲区的消息
dmesg
  • 最后,可以卸载内核模块
rmmod example

file

猜你喜欢

转载自blog.csdn.net/weixin_42534940/article/details/131753311