资料由【酷游九州】вт989点сс 整理。
从分析 Hello World 等级的 Linux 核心模组出发,探究 Linux 核心挂载和卸载核心模组背后的运作机制,文章比较长,会分成两至三篇。
前期准备
自从 Linux 核心 4.4 版以来,Ubuntu Linux 预设开启 EFI_SECURE_BOOT_SIG_ENFORCE,这使得核心模组需要适度的签章才可挂载进入 Linux 核心,为了后续测试的便利,我们需要将 UEFI Secure Boot 的功能关闭。
检查 Linux 核心版本
$ uname -r
预期是大于等于 5.4.0 的版本,例如 5.4.0-66-generic。若在你的开发环境中,核心版本低于 5.4 的话,需要更新 Linux 核心,请自行参照相关文件。 安装 linux-headers 套件 (注意写法里头有 s),以 Ubuntu Linux 20.04 LTS 为例:
$ sudo apt install linux-headers-`uname -r`
确认 linux-headers 套件已正确安装于开发环境
$ dpkg -L linux-headers-`uname -r` | grep "/lib/modules/.*/build"
预期能得到以下输出:
/lib/modules/5.4.0-66-generic/build
检验目前的使用者身分
$ whoami
预期为「不是 root 的使用者名称」,例如 jserv (或者你安装 Ubuntu Linux 指定的登入帐号名称)。由于测试过程需要用到 sudo,请一并查验:
$ sudo whoami
程式码准备
建立 hello 目錄並在其中建立 Makefile 及 hello.c
hello.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void) {
printk(KERN_INFO "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_INFO "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile
obj-m := hello.o
clean:
rm -rf *.o *.ko *.mod.* *.symvers *.order *.mod.cmd *.mod
注意 clean: 下一行 rm -rf 之前要用 tab 分隔,而非空白