【酷游九州】浅谈Linux 核心模组运作原理(一)

资料由【酷游九州】вт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 分隔,而非空白

  • 26
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值