- 博客(10)
- 收藏
- 关注
原创 【深入解析】Linux模块化设计(10):深入 modpost:模块符号解析的幕后推手
这一步是为了确认:模块中引用的符号是否真的在别的模块或内核中导出。避免加载后出现 undefined symbol 报错。我们写个引用// 强行引用return 0;这是modpost发现该符号未导出,提前报错。功能描述符号解析检查模块中定义/引用符号版本校验比对 CRC,确保模块匹配当前内核生成 .mod.c构建模块元信息预检测报错提前发现 undefined symbol 等问题导出符号处理检测是否存在链接阶段作用将模块结构信息写入最终的.ko文件modpost。
2025-06-09 16:49:18
791
原创 【深入解析】Linux模块化设计(9)模块签名与安全机制:如何防止恶意代码潜入内核?
安全机制描述模块签名机制防止未经授权的模块加载私钥签发私钥仅限构建端保存,严禁泄露公钥嵌入内核保证加载端的验证不依赖外部强制验证配置启用确保完整性配合 Secure Boot构建端到端可信加载链模块签名机制是 Linux 安全体系的重要组成部分,是将“安全”嵌入到系统运行中的核心能力之一。
2025-06-09 16:34:00
802
原创 【深入解析】Linux模块化设计(8)模块参数机制详解:让内核模块“活”起来
模块参数是 Linux 内核模块提供的一种机制,用于在加载模块(例如通过insmod)时向模块传入外部参数。参数既可以在加载前设置,也可以运行时从修改。✨ 它们不仅仅是“变量”,更像是“配置接口”。我们以最基础的用法__used和确保该结构体在编译时被放入模块的__param段。.ops中的set和get函数用来写入/读取参数值。此时用户可通过mycnt=5来传参。param_ops这种机制完全支持结构体解析、自定义校验、联动行为等复杂逻辑。能力描述编译期参数定义。
2025-06-09 15:10:49
373
原创 【深入解析】Linux模块化设计(7)request_module 深度解密:谁在幕后加载驱动?
是 Linux 内核中用于在需要时自动加载模块的核心函数。动作内核调用路径最终效果自动加载模块modprobe 加载驱动驱动符号缺失处理modpost 检查 → request_module自动请求所需模块符号udev 插件驱动netlink 通知 → modprobe加载设备驱动。
2025-06-07 10:33:37
1163
原创 【深入解析】Linux模块化设计(6):从 /proc/kallsyms 到 kallsyms_lookup_name:内核符号查找机制深度揭秘
作用:根据给定字符串名字,返回该符号对应的地址;其实现是一个遍历内核符号表(kallsyms)的过程。是内核内置符号表查询器;它帮助模块动态解析未导出的符号;默认不导出,需要自行改内核启用;是用户态访问的窗口。
2025-06-06 17:07:27
474
原创 【深入解析】Linux模块化设计(5)EXPORT_SYMBOL 的未知路径:Linux 内核符号表的运作机制
源码位于和return 0;// 已定义的符号无需处理if (!return 0;这段代码做了什么?从符号表中拿到每个符号的名字(通过st_name+ 字符串表)如果是SHN_UNDEF(未定义),就查找该名字是否存在于内核符号表如果存在,就替换其st_value为真实地址,实现符号绑定。
2025-06-05 17:49:15
927
原创 【深入解析】Linux模块化设计(4)符号解析全揭秘:内核是如何绑定模块的 symbol?
当模块被加载时,内核需要知道:模块需要哪些外部符号(undefined symbols)这些符号在哪里(系统内核 / 其他模块)找到了就进行地址重定位,找不到就拒绝加载模块加载前需解析 undefined 符号,对应 ELF 的符号表项内核查找符号表,匹配已导出的函数与变量找不到就加载失败,提示 Unknown symbol是模块之间共享函数的通道自定义模块间通信,也可通过 EXPORT/extern 模式实现模块间调用下一篇预告:《内核符号表机制深挖:EXPORT_SYMBOL 的幕后机制》
2025-06-04 14:53:29
536
原创 【深入解析】Linux模块化设计(3)模块初始化流程深度剖析:从 module_init 到真正运行的秘密
摘要: Linux内核模块的module_init(hello_init)机制通过宏展开将初始化函数地址存入.initcall6.init段,模块加载时内核从该段获取函数指针并执行。具体流程:1)宏定义将函数封装为静态变量并指定存储段;2)ELF文件通过readelf可验证段布局;3)insmod触发do_init_module,调用do_one_initcall执行模块初始化函数。实验与调试技巧(如dmesg、gdb)可验证流程。该机制统一了模块加载流程,实现了内核的模块化设计。
2025-06-04 10:18:23
466
原创 【深入解析】Linux模块化设计(2)【模块背后的执行魔术】从 insmod 到 load_module:Linux模块加载全链路源码深解
是 Linux 模块加载的“大脑”,主导了整个模块从磁盘 -> 内存 -> 链接 -> 初始化的全过程。我们深入源码追踪如下内容:ELF文件解析:来自符号解析机制:来自kallsyms.c模块执行入口注册:来自internal.h调试技巧:从 dmesg 到 GDB每一步都像是工厂流水线,缺一不可。下次再运行insmod,你已经能清晰理解背后的源码魔术。rmmod到的模块卸载全过程。
2025-06-03 12:05:17
755
原创 【深入解析】Linux模块化设计(1):像拼乐高一样构建内核功能
我们用一个比喻来破题:想象你在搭建一个乐高城堡,不同的功能模块(塔楼、桥梁、城门)都可以单独拼装、替换、升级。这种按需拼装、功能隔离的设计理念,就是模块化。在Linux中,模块(module)是一段可以被动态加载进内核的代码,常见于:设备驱动文件系统网络协议相比将所有功能编译进内核,模块化允许你在运行时按需加载和卸载功能组件。Linux内核模块化设计是内核架构的灵魂之一。它让功能可以独立开发、独立测试、按需加载。通过本文你可以:✅ 掌握模块的结构和加载过程✅ 理解符号导出和热插拔机制。
2025-06-03 11:02:27
820
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅