Kernel modules — The Linux Kernel documentation

环境和准备

系统和内核版本信息:6.1.0-17-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.69-1 (2023-12-30) x86_64 GNU/Linux

内核模块的编译需要内核源代码的支持,所以需要下载内核源代码和头文件。

sudo apt search linux-headers-$(uname -r)
sudo apt install linux-headers-$(uname -r)

通常 Linux 源代码会被安装在 /usr/src 目录下,通过软连接被拷贝到 /lib/modules/<kernel_versions>/build

从 Hello World 开始

目录结构:

module-kernel |- hello.c |- Makefile |- Kbuild(可选)

模块中的源代码文件:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

static int __init hellowolrd_init(void) {
    pr_info("Hello world!\\n");
    return 0;
}

static void __exit hellowolrd_exit(void) {
    pr_info("End of the world\\n");
}

module_init(hellowolrd_init);
module_exit(hellowolrd_exit);
MODULE_AUTHOR("John Madieu <[email protected]>");
MODULE_LICENSE("GPL");

Makefile 和 Kbuild 编译

Makefile 和 Kbuild 文件

在 Makefile 当中 进行 Kbuild:

EXTRA_CFLAGS = -Wall -g

obj-m := hello.o

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

all default: modules

install: modules_install

modules modules_install help clean:
	make -C $(KERNELDIR) M=$(PWD) $@