嵌入式 Linux 驱动开发:第一个内核模块怎么写?

发布时间:2026/9/6 1:24:47
嵌入式 Linux 驱动开发:第一个内核模块怎么写? 嵌入式 Linux 驱动开发第一个内核模块怎么写单片固件里加个驱动要重新编译整个镜像、重新烧录Linux 里却只需要一条insmod命令驱动就悄悄挂进了正在运行的内核。这个热插拔的秘密叫内核模块LKM。今天带你写第一个。一、为什么内核需要模块早期内核把所有功能静态编译进镜像。好处是简单确定坏处是换块网卡、插个 USB 设备就要重新配置、重新编译、重新部署整个内核——“牵一发而动全身”。可加载内核模块LKM解决这个矛盾把设备驱动等编译成独立文件.ko运行时按需加载不需要重启。对嵌入式场景格外有价值开发板出厂烧一个通用内核不同客户外接的传感器、显示屏千差万别——一份内核 多份驱动的灵活组合而不是为每种硬件单独出一份固件。二、模块和普通程序的三点不同跑在内核态没有独立进程地址空间直接运行在内核虚拟地址空间printk、kmalloc都发生在内核上下文不能用标准 C 库模块只能调用内核导出的函数printk、kmalloc、copy_to_user与内核耦合极深数据结构版本、函数原型必须和当前内核严格一致否则轻则加载失败重则内核崩溃oops/panic可以把模块理解成内核的插件——不独立运行依附宿主、用宿主 API、守宿主规则。三、第一个内核模块长什么样#includelinux/module.h#includelinux/kernel.h#includelinux/init.hstaticint__inithello_init(void){printk(KERN_INFOHello, kernel module!\n);return0;/* 返回 0 加载成功 */}staticvoid__exithello_exit(void){printk(KERN_INFOGoodbye, kernel module!\n);}module_init(hello_init);/* 加载入口insmod 时调用 */module_exit(hello_exit);/* 卸载入口rmmod 时调用 */MODULE_LICENSE(GPL);MODULE_AUTHOR(Kruptos);MODULE_DESCRIPTION(My first kernel module);编译后用insmod hello.ko加载dmesg能看到打印rmmod hello卸载。整个过程不重启、不重编内核。四、代码演示模拟 insmod 的加载检查definsmod(module_name,kernel_ver):简化检查 .ko 文件 vermagic 内核版本兼容ifmodule_name.endswith(.ko)andv6.1inkernel_ver:return(f[OK]{module_name}已加载到内核{kernel_ver}\nf printk: Hello, kernel module!\nf 注册成功模块处于运行态)returnf[FAIL] vermagic 不匹配模块为其他内核版本编译print(insmod(hello_drv.ko,v6.1.0))print()print(insmod(hello_drv.ko,v5.15.0))运行输出[OK] hello_drv.ko 已加载到内核 v6.1.0 printk: Hello, kernel module! 注册成功模块处于运行态 [FAIL] vermagic 不匹配模块为其他内核版本编译看出关键点了模块必须和当前内核版本匹配vermagic 校验——这就是为什么交叉编译时工具链版本要对齐否则insmod直接拒绝。五、避坑清单内核版本必须一致vermagic 不匹配会拒绝加载重编模块而不是降级内核不要用 printf/malloc内核态只能用 printk/kmalloc用了标准库直接编译失败返回 0 才是成功init 函数返回非 0 表示加载失败内核会回滚打印用 KERN_INFO 等级别printk 不带级别可能不显示dmesg看内核日志嵌入式开发板先交叉编译x86 上编的模块 ARM 板子加载不了六、想系统学嵌入式 Linux 驱动本文精选自ima 知识号【Kruptos】《嵌入式 Linux 驱动开发详解》订阅库第 009 期内核模块是什么、第 010 期 module_init 机制等 100 期系统教程从内核架构、模块机制、字符设备、platform 总线到设备树与实战驱动每期配可运行代码。 完整系列 100 期 配套代码已在 ima 知识号发布本文只是系列的一个切片。完整系列100 期系统教程 每期可运行代码在 ima 知识号【Kruptos】持续更新中 67 技术知识库信号与系统、SDR 软件无线电、数字信号处理、操作系统、AI Agent、大模型微调……几乎覆盖全部软硬件技术栈 8 款 AI 技能系列生产、知识库管理、CMMI 受管开发、自进化 Agent 等已在 ima 技能广场上架即装即用✅ 全部免费订阅后续更新自动推送 订阅方式打开 ima腾讯智能工作台→ 搜索「Kruptos」→ 一键订阅。或在 ima 内直接搜索《嵌入式 Linux 驱动开发详解》等知识库名称。 你写过最惊险的内核代码是什么评论区聊聊——想看字符设备还是 platform 总线点赞高的安排。作者Kruptos西电毕业13 年无线通信/DSP/嵌入式科研原创内容转载注明出处