资讯详情

【译】《心悟内核:先懂设计,再读代码》—24、内核模块如何互相感知:仅能通过导出符号_FINISH

📅 2026/11/4 6:52:37 | 华诺云谱 👁 阅读
【译】《心悟内核:先懂设计,再读代码》—24、内核模块如何互相感知:仅能通过导出符号_FINISH
作者Moon Hee Lee原文 The Kernel in the Mind内核模块如何互相感知仅能通过导出符号内核模块是独立编译的内核功能单元设计为可在运行时加载。模块提供了一种扩展内核的灵活方式 —— 通常用于设备驱动、文件系统、密码学例程或协议实现无需完整重新编译内核或重启系统。一旦插入模块就成为运行中内核的一部分运行在特权空间可完整访问内核环境。尽管拥有这样的访问权限内核模块在设计上是相互隔离的。除非内核函数或变量被显式导出否则模块无法引用或调用它们。内核不提供自动发现、后期绑定或符号查找机制。所有交互都必须通过由EXPORT_SYMBOL或EXPORT_SYMBOL_GPL声明的预定义接口完成。该边界是有意设计的。内核不保证稳定的内部 ABI并且仅对导出接口提供支持。任何未显式导出的符号都视为内部符号在不同版本间可能发生变更或被移除。导出接口构成模块与内核其余部分之间唯一受支持的边界。加载模块时模块内的未定义符号会与全局符号表进行匹配该符号表仅包含内核选择对外暴露的标识符。如果缺少所需符号模块加载失败。符号解析仅发生一次 —— 在加载阶段无法动态调整。模块不能访问彼此的内部符号除非这些符号被显式导出。无论模块是否联合开发、是否在同一配置下编译、或是存放于相关源码目录都没有区别。没有EXPORT_SYMBOL符号就是不可见的。从模块视角来看未导出的符号等同于不存在。模块分层与堆叠十分常见但必须严格显式定义。一个模块可以依赖另一个模块注册回调、提供处理程序表或暴露工具函数 —— 但只能通过导出符号和已建立的注册点。不存在运行时自动发现与连接。这并非技术限制而是刻意的架构决策。内核强制执行这种隔离以保留内部灵活性、版本无关性以及系统完整性。task_struct、cred、mm_struct这类核心结构体是内核行为的关键除非通过安全接口有意对外暴露否则永远不能直接访问。无论模块与内核功能结合得多紧密每个模块都被当作外部代码。模块必须声明许可证提前解析依赖并且访问范围仅限于内核显式选择暴露的接口。内核模块只能通过导出符号感知彼此没有例外。这不是约定而是强制实施的设计精确、有意对 Linux 内核的长期稳定至关重要。如本文对你有些许帮助欢迎大佬支持我一下点赞收藏关注、关注公众号等您的支持是我持续创作的竭动力支持我的方式
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑