Linux 内核开发基础:常用命令与函数
Linux 内核模块开发入门必知:insmod/rmmod 加载卸载命令、module_init/module_exit 入口出口函数,以及 MODULE_LICENSE、MODULE_AUTHOR、MODULE_DESCRIPTION、MODULE_ALIAS 等模块描述宏的用法与含义。
Linux 内核开发基础:常用命令与函数
一、项目背景
内核模块(Kernel Module)是 Linux 驱动开发的核心形态:它允许开发者在不重新编译整个内核的情况下,动态地向内核添加设备驱动、文件系统、网络协议等功能代码。对于从事工业设备、嵌入式 Linux 开发的工程师来说,掌握内核模块的加载/卸载机制与模块描述宏,是入门驱动开发的第一课。
本篇文章梳理内核模块开发中最基础、最常用的命令与函数,为后续编写真正的字符设备驱动、平台驱动打下基础。
二、技术方案:内核模块的运行机制
内核模块与普通应用程序最大的区别在于运行空间与生命周期:
| 维度 | 内核模块 | 普通应用 |
|---|---|---|
| 运行空间 | 内核空间(Ring 0) | 用户空间(Ring 3) |
| 入口 | module_init 指定的函数 | main 函数 |
| 退出 | module_exit 指定的函数 | return / exit |
| 加载方式 | insmod / modprobe | 执行可执行文件 |
| 依赖库 | 内核符号表 | 用户态动态库 |
三、系统架构:加载/卸载命令
# 加载内核模块
insmod xxx.ko
# 卸载内核模块
rmmod xxx.ko
- insmod:将 .ko 模块文件插入内核,立即执行
module_init注册的初始化函数; - rmmod:从内核移除模块,触发
module_exit清理函数释放资源。
需要说明的是,insmod 只做"插入"动作,不考虑模块依赖关系;若要自动解析依赖(如模块 A 依赖模块 B),应使用 modprobe 配合 /lib/modules/$(uname -r)/modules.dep 依赖数据库。
四、实施过程:模块入口/出口与描述宏
4.1 入口与出口函数
module_init(init_func); // 加载模块时该函数自动执行,进行初始化操作
module_exit(exit_func); // 卸载模块时该函数自动执行,进行清理操作
- module_init:注册模块初始化函数。加载模块时由内核自动调用,通常完成设备注册、资源申请、procfs/设备节点创建等初始化动作;
- module_exit:注册模块卸载函数。rmmod 时由内核自动调用,负责释放初始化时申请的资源,防止内存泄漏与设备悬挂。
4.2 模块描述宏
MODULE_LICENSE("GPL"); // 声明模块遵循的软件许可协议
MODULE_AUTHOR("Your Name"); // 模块作者信息
MODULE_DESCRIPTION("A simple demo module"); // 模块功能简介
MODULE_ALIAS("alias-name"); // 为模块设置别名
| 宏 | 作用 |
|---|---|
| MODULE_LICENSE | 声明模块代码接受的许可协议。Linux 内核遵循 GPL V2 开源协议,模块声明保持一致可避免"污染"内核符号表问题;不声明或声明专有许可时,部分 GPL-only 符号将无法使用 |
| MODULE_AUTHOR | 描述模块作者信息,便于维护者追溯代码来源 |
| MODULE_DESCRIPTION | 对模块功能的简单介绍,可通过 modinfo 查看 |
| MODULE_ALIAS | 给模块设置一个别名,常用于自动加载匹配(如 MODULE_ALIAS("platform:my-device")) |
4.3 查看模块信息
modinfo xxx.ko # 查看模块的 license、author、description、alias 等信息
lsmod # 列出当前已加载的所有模块
dmesg # 查看内核日志(模块加载/卸载时 printk 的输出)
五、应用价值
- 开发效率:模块化开发无需反复重编内核,迭代速度快,适合工业控制设备的驱动适配;
- 稳定性:驱动出问题时可直接 rmmod 卸载修复,避免整机重启,对产线设备尤其重要;
- 基础铺垫:模块机制 + 描述宏是编写字符设备驱动、中断处理、内核线程等高级主题的前置知识;
- 调试手段:配合 dmesg 与 modinfo,可快速定位模块加载失败原因(符号未定义、许可冲突、依赖缺失等)。
六、SEO关键词
Linux内核、内核模块、insmod、rmmod、module_init、module_exit、MODULE_LICENSE、驱动开发、内核编程、嵌入式Linux
推荐阅读
更多工业 AI、智能制造与技术实践文章
TRIO-Basic 从入门到精通(五):直线与圆弧插补指令的使用
本文讲解 TRIO-Basic 三大运动指令:MOVE 相对移动、MOVEABS 绝对移动与 MOVECIRC 平面圆弧插补,给出各自的语法格式、完整可运行的代码示例(含轴参数段与矩形圆角轮廓插补示例),并说明增益参数的使用前提,帮助开发者快速上手多轴轨迹编程。
TRIO-Basic 从入门到精通(二十):Trio通过空间圆弧三点计算圆弧中心和半径
本文用TRIO-Basic手写实现空间圆弧三点求圆心与半径算法:由三点确定圆弧平面法向量,求两条中垂线交点得到圆心并输出半径,与Trio原装SPHERE_CENTRE指令计算结果对比一致,适用于空间圆弧插补与轨迹规划。
C#调用Intel NPU实现YOLOv26极速推理:OpenVINO工业视觉加速实践
通过C# + OpenVINO Runtime调用Intel Core Ultra NPU运行YOLOv26模型,实现低功耗、毫秒级的工业边缘AI视觉推理,涵盖模型导出、环境配置、推理代码与FP16/INT8/异步推理等性能优化实践。
C#工业视觉平台结合YOLOv26与OpenVINO
从数据标注、自动训练到Intel NPU边缘推理的完整工业AI方案:C#工业软件平台 + YOLOv26训练框架 + OpenVINO模型转换 + Intel NPU边缘推理,实现图像采集、自动标注、模型训练到现场推理的完整AI视觉闭环。
MY-BASIC 应用(一):轻量级嵌入式 BASIC 解析器介绍
MY-BASIC 是一个用标准 C 语言编写的轻量级 BASIC 解释器:不足 128KB 内存占用、可嵌入可扩展、支持原型编程与 Lambda 函数式编程、Unicode、列表/字典集合,适合嵌入式设备脚本化控制。
Linux系统篇(七)——工具篇(二):一篇搞懂 C 语言程序从代码到可执行文件的完整旅程
拆解 C 程序预处理、编译、汇编、链接四步变身流程,讲透条件编译与静态、动态链接差异,附分步实操与报错排查。
