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
。
目录结构:
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:
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) $@