用途
该技能引导代理编写可加载 Linux 内核模块(LKM),涵盖 Kbuild 构建系统、模块参数、/proc 与 sysfs 接口、字符设备实现、使用 KGDB 与 ftrace 进行内核调试,以及面向 Secure Boot 的模块签名。
触发场景
- 如何编写 Linux 内核模块?
- 如何为内核模块添加参数?
- 如何创建 /proc 或 sysfs 条目?
- 如何实现字符设备驱动?
- 如何使用 KGDB 调试内核模块?
- 如何为 Secure Boot 签名内核模块?
主要能力与工作流
1. 最小内核模块
提供最小可加载内核模块示例(hello.c),包含模块许可、作者、描述、版本声明,以及 __init/__exit 函数与 module_init/module_exit 宏;同时给出 Kbuild 所需的 Makefile 结构(obj-m、KDIR、all、clean),并列出构建(make)、加载(insmod)、检查(lsmod、dmesg)、卸载(rmmod)、查看模块信息(modinfo)等命令。
2. 模块参数
通过 module_param 与 MODULE_PARM_DESC 定义参数,说明权限标志(0 表示无 sysfs 条目,S_IRUGO 可读,S_IWUSR 可写),支持加载时传参(insmod hello.ko count=3 name="kernel")以及运行时通过 sysfs 修改(若设置了 S_IWUSR)。
3. /proc 文件系统接口
演示使用 proc_dir_entry、seq_file、proc_ops 创建 /proc 条目,包含 show、open、read、lseek、release 回调,以及 proc_create 与 proc_remove 的初始化与清理流程。
4. sysfs 接口
演示使用 kobject、kobj_attribute 创建 sysfs 属性,包含 show/store 回调与 __ATTR 宏,通过 kobject_create_and_add 与 sysfs_create_file 注册,并可通过 cat/echo 读写。
5. 字符设备
演示使用 cdev、file_operations、uaccess 实现字符设备,包含 open、release、read(copy_to_user)、write(copy_from_user),以及 register_chrdev 注册,并说明加载模块后创建设备节点(mknod)并进行读写测试。
6. 使用 KGDB 与 ftrace 调试
- KGDB:通过串口或网络启动内核 GDB 调试(kgdboc、kgdboe),并在调试主机上使用 gdb 连接。
- ftrace:使用 function tracer,设置 set_ftrace_filter、tracing_on,查看 trace 输出。
- 动态调试:通过 dynamic_debug/control 启用 pr_debug() 输出。
7. EXPORT_SYMBOL 与 EXPORT_SYMBOL_GPL
说明二者区别:EXPORT_SYMBOL 允许任意模块链接(包括专有模块);EXPORT_SYMBOL_GPL 仅允许 GPL 兼容模块链接。涉及 GPL-only 内核内部符号时应使用 EXPORT_SYMBOL_GPL,否则加载非 GPL 模块会触发污染警告,可通过 modinfo 与 dmesg 检查。
8. KUnit 内核内单元测试
提供 KUnit 测试示例(test_mymod.c),包含 KUNIT_EXPECT_EQ、kunit_case、kunit_suite 与 kunit_test_suite 宏;说明树内运行方式(kunit.py run --filter)以及树外需启用 CONFIG_KUNIT 或使用 kunit 模块目标。
9. Rust 内核模块(内核 6.x + CONFIG_RUST=y)
需要内核以 CONFIG_RUST=y 构建,并由内核树固定相应的 Rust 工具链。示例展示 module! 宏、kernel::Module trait 的 init 实现与 pr_info! 输出;构建前可用 make LLVM=1 rustavailable 验证工具链,通过 make M=drivers/rust_example modules 构建并加载。
10. 模块签名(Secure Boot,内核 6.x)
当启用 CONFIG_MODULE_SIG 时(多数带 Secure Boot 的发行版内核默认开启),内核会强制验证模块签名。流程包括:使用 openssl 生成签名密钥与证书(生产环境应使用组织 PKI)、使用 scripts/sign-file 以 sha256 或 sha512 签名模块、通过 modinfo 检查签名者、通过 mokutil --import 在 UEFI 上注册 MOK 密钥、检查内核 lockdown 模式。在 lockdown integrity 或 confidentiality 下,未签名模块会被拒绝;发行版内核还可能要求密钥注册到内核内置可信密钥环(CONFIG_SYSTEM_TRUSTED_KEYS)。
适用场景
适用于低层开发中编写、扩展和调试 Linux 内核模块的各类任务,包括构建配置、参数与接口暴露、字符设备驱动、内核级调试、单元测试、Rust 模块以及 Secure Boot 签名。
限制
资料未提供除上述内容以外的功能、平台支持范围、性能数据或价格信息。Kbuild 系统详情参见 references/kbuild-basics.md。
相关技能
- 内核测试(KUnit、kselftest)使用 skills/kernel/kernel-testing
- 超出最小模块的字符/平台驱动模式使用 skills/kernel/device-drivers
- kgdb、ftrace、kprobes 使用 skills/kernel/kernel-debugging
- 无需模块的用户空间内核追踪使用 skills/observability/ebpf
- 配合 KGDB 的 GDB 会话管理使用 skills/debuggers/gdb
- 检查模块 ELF 结构使用 skills/binaries/elf-inspection