首先需要安装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/
若题目下发了一个内核,同时你需要编译一个可以在上面加载的内核模块,你可能会遇到以下报错:
module cryptodev: .gnu.linkonce.this_module section size must match the kernel's built struct module size at run time
cryptodev: version magic '6.5.7 SMP preempt mod_unload modversions ' should be '6.5.7 SMP preempt mod_unload '
Unknown symbol devmap_managed_key (err -2)
你开了 **CONFIG_FS_DAX
** ,但下发的没开
Unknown symbol __check_object_size (err -2)
Unknown symbol fortify_panic (err -2)
Unknown symbol __ubsan_handle_out_of_bounds (err -2)
你开了CONFIG_UBSAN
目前clangd是vscode上阅读/编写 c/cpp 程序的最佳插件,但对于内核模块,需要一些配置来使intellisense生效。