【Linux】管理和新增内核模块
本文最后更新于 26 天前,其中的信息可能已经有所发展或是发生改变。

概述

linux提供了一种称为模块(Module)的机制,模块具有如下的特点

  1. 模块自身不被编译到内核映像中,从而不影响内核映像的大小
  2. 一旦模块被加载,模块和内核中的其他部分的功能完全一样

管理方式

  1. 显示当前装入的内核模块:
   lsmod
  1. 显示模块信息:
   modinfo module_name
  1. 显示所有模块的配置信息:
   modprobe -c | less
  1. 显示某个模块的配置信息:
   modprobe -c | grep module_name
  1. 显示一个装入模块使用的选项,可以使用sysfsutils包中的systool(1)
   systool -v -m module_name
  1. 显示模块的依赖关系:
   modprobe --show-depends module_name

创建一个自己的内核模块

linux提供了一种外部模块构建方式,可以使外部模块与linux源码独立存放在不同的路径下

首先需要下载并编译一套linux代码,接着就可以创建自己的内核模块。这个独立模块的目录结构也非常的简单,重点在于Makefile的编写

demo
   ├── Makefile
   └── demo.c

demo.c内容

#include <linux/module.h>    /* Needed by all modules */
#include <linux/kernel.h>    /* Needed for KERN_INFO */
#include <linux/init.h>        /* Needed for the macros */

static int __init demo_init(void)
{
   printk(KERN_INFO "Hello, world 2\n");
   return 0;
}

static void __exit demo_exit(void)
{
   printk(KERN_INFO "Goodbye, world 2\n");
}

module_init(demo_init);
module_exit(demo_exit);

Makefile内容

obj-m += demo.o
KERNELBUILD += /home/pi/code/linux-5.4#这里的路径是一套已经编译完成的linux源码

all:
   make -C ${KERNELBUILD} M=${shell pwd} modules

clean:
   make -C ${KERNELBUILD} M=${shell pwd} clean

编译方式

这个独立模块的编译和清理方式和普通的模块并没有什么区别,只需要在自己的模块代码根目录下执行make all或者make clean就可以实现编译或清理

编译产物

在执行make all命令之后可以目录下多出了很多编译产物,其中就包括内核ko模块

demo
   ├── Makefile
   ├── Module.symvers
   ├── demo.c
   ├── demo.ko
   ├── demo.mod
   ├── demo.mod.c
   ├── demo.mod.o
   ├── demo.o
   └── modules.order

参考文档

内核模块 – Arch Linux 中文维基

Linux 内核模块编程指南

上一篇
下一篇