linux可载入模块机制,解析 Linux 内核可装载模块的版本检查机制

本文详细探讨了Linux内核可装载模块(LKM)的版本检查机制,确保模块与内核版本匹配以维持系统稳定性。主要内容包括:模块的引入、版本差异、装载过程、版本检查的重要性,以及CRC值和vermagic校验的过程。通过对模块CRC值和vermagic信息的检查,内核避免了不兼容模块的加载,从而保证了系统的安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介: 为保持 Linux 内核的稳定与可持续发展,内核在发展过程中引进了可装载模块这一特性。内核可装载模块就是可在内核运行时加载到内核的一组代码。通常 , 我们会在两个版本不同的内核上装载同一模块失败,即使是在两个相邻的补丁级(Patch Level)版本上。这是因为内核在引入可装载模块的同时,对模块采取了版本信息校验。这是一个与模块代码无关,却与内核相连的机制。该校验机制保证了内核装载的模块是用户认可的,且安全的。本文将从内核模块发布者的角度思考模块版本检查机制,并从开发者与授权 root 用户的角度去使用及理解该机制。

内核可装载模块概述

Linux 在发展过程中(即自 Linux 1.2 之后)引进了模块这一重要特性,该特性提供内核可在运行时进行扩展。可装载模块(Loadable Kernel Module,即 LKM)也被称为模块,就是可在内核运行时加载到内核的一组目标代码(并非一个完整的可执行程序)。这就意味着在重构和使用可装载模块时并不需要重新编译内核。模块依据代码编写与编译时的位置可分:内部模块和外部模块,即 in-tree module 和 out-of-tree module,在内核树外部编写并构建的模块就是外部模块。如果只是认为可装载模块就是外部模块或者认为在模块与内核通讯时模块是位于内核的外部的,那么这在 Linux 下均是错误的。当模块被装载到内核后,可装载模块已是内核的一部分。另外,我们使用的 Linux 发行版在系统启动过程 initrd 中已使用了必要的模块,除非我们只讨论基础内核(base kernel)。本文主要是对 Linux 2.6 的外部模块进行讨论的。

可装载模块在 Linux 2.6 与 2.4 之间存在巨大差异,其最大区别就是模块装载过程变化(如 图 1所示,在 Linux 2.6 中可装载模块在内核中完成连接)。其他一些变化大致如下:

模块的后缀及装载工具;

对于使用模块的授权用户而言,模块最直观的改变应是模块后缀由原先的 .o 文件(即 object)变成了 .ko 文件(即 kernel object)。同时,在 Linux 2.6 中,模块使用了新的装卸载工具集 module-init-tools(工具 insmod 和 rmmod 被重新设计)。模块的构建过程改变巨大,在 Linux 2.6 中代码先被编译成 .o 文件,再从 .o 文件生成 .ko 文件,构建过程会生成如 .mod.c、.mod.o 等文件。

模块信息的附加过程;

在 Linux 2.6 中,模块的信息在构建时完成了附加;这与 Linux 2.4 不同

### Linux 系统引导过程解析 #### 一、BIOS/UEFI 阶段 计算机加电自检 (POST) 后,会执行 BIOS 或 UEFI 固件中的指令。此阶段主要负责硬件检测和初始化工作,并选择合适的设备来加载操作系统启动程序。 对于较新的系统而言,在 UEFI 模式下还会验证 Secure Boot 设置以确保后续加载的操作系统未被篡改[^1]。 #### 二、MBR/GPT 和 GRUB 载入 一旦选择了用于启动的硬盘驱动器,则根据分区表类型(传统 MBR 或现代 GPT),读取位于该介质开头处的小型引导记录。对于采用 GRUB2 的大多数当代发行版来说: - 如果是基于 MBR 方式的安装,GRUB 将驻留在第一个扇区; - 若为 GPT 结构,则存在于 EFI System Partition 中的一个特殊文件内。 随后 GRUB 显示菜单供用户挑选欲运行的具体内核版本及其参数配置选项。 #### 三、Kernel 初始化 选定目标之后即开始实际装载 Linux 内核映像到内存之中并传递必要的命令行参数给它。此时还可能涉及到解压压缩过的 initramfs 文件系统以便提供早期访问某些模块化驱动的支持能力——特别是当根文件系统并非直接可寻址的情况下更为重要[^2]。 ```bash /init # This script is executed from the initial ramdisk. ``` #### 四、Initramfs 执行与 RootFS 切换 initramfs 是一个临时性的 root 文件系统,其职责在于完成诸如挂载真正的根目录之前所需的一切准备工作,比如激活加密卷组、网络存储连接等操作。完成后通过 `pivot_root` 或者类似的机制实现向正式环境过渡。 #### 五、Systemd/PID 1 接管 随着真实根文件系统的就绪以及 chroot 至新位置的动作结束,现在可以由 systemd 取代之前的进程成为 PID 1 并继续推进剩余的服务启动流程了。这包括但不限于设置主机名、调整 SELinux 状态、应用 `/etc/fstab` 定义下的自动挂载规则等一系列任务。 #### 六、多用户模式和服务供应 最终达到 multi-user.target 或 graphical.target 目标单元状态时意味着常规应用程序层面上的功能已经全部可用;与此同时也会依据预设条件触发相应的守护进程从而保障各类后台作业得以正常运作直至下次重启为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值