环境配置

首先需要安装headers

sudo apt update
apt-cache search linux-headers-`uname -r`
# 如果懒得判断版本,可以安装以下包
sudo apt install linux-headers-generic

headers会被放到 /usr/src/linux-headers-uname -r``

编译

编写以下Makefile,源码为driver.c

obj-m += driver.o

PWD := $(CURDIR)

all:
	$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
	$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

参考:The Linux Kernel Module Programming Guide (sysprog21.github.io)

对于从源码编译的kernel,需要额外命令生成对于的/usr/include和/lib/modules

# 先确保已经完全make过了
make
# 会生成在modules下
make modules_install INSTALL_MOD_PATH=./modules/

若题目下发了一个内核,同时你需要编译一个可以在上面加载的内核模块,你可能会遇到以下报错:

  1. module cryptodev: .gnu.linkonce.this_module section size must match the kernel's built struct module size at run time

  2. cryptodev: version magic '6.5.7 SMP preempt mod_unload modversions ' should be '6.5.7 SMP preempt mod_unload '

  3. Unknown symbol devmap_managed_key (err -2)

    你开了 **CONFIG_FS_DAX** ,但下发的没开

  4. Unknown symbol __check_object_size (err -2)

    你开了CONFIG_HARDENED_USERCOPY

  5. Unknown symbol fortify_panic (err -2)

    你开了CONFIG_FORTIFY_SOURCE

  6. Unknown symbol __ubsan_handle_out_of_bounds (err -2)

    你开了CONFIG_UBSAN

clangd && vscode

目前clangd是vscode上阅读/编写 c/cpp 程序的最佳插件,但对于内核模块,需要一些配置来使intellisense生效。