news 2026/4/16 13:56:42

内核模块符号的导出

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
内核模块符号的导出
grep -rn "EXPORT_SYMBOL"

搜索EXPORT_SYSMBOL这个宏

这一节讲的是 **“内核模块之间如何共享函数 / 变量” 的核心机制 **,可以拆解为 3 个关键部分理解:

1. 为什么需要 “内核模块符号导出”?

内核模块编译后是独立的.ko文件,默认情况下:

  • 模块 A 里的函数 / 变量,模块 B 是 “看不见” 的,没法直接调用;
  • 但复杂驱动需要分层(比如把 “硬件控制” 和 “业务逻辑” 拆成两个模块),这时候就需要让模块 A 把自己的函数 / 变量 “暴露出来”,供模块 B 调用 —— 这个 “暴露” 的操作,就是 “符号导出”。

2. 什么是 “内核模块符号导出”?

简单说:在模块里,用特定宏把函数 / 变量标记为 “公共可用”,当这个模块加载到内核时,这些函数 / 变量会被记录到内核公共符号表里,其他模块加载时就能从这个表中找到并调用它们。

3. 具体怎么实现(用到的工具)?

这一节里提到的两个宏,就是实现符号导出的核心:

作用
EXPORT_SYMBOL(sym)导出符号(函数 / 变量,sym是要导出的名字),所有内核模块都能调用
EXPORT_SYMBOL_GPL(sym)仅允许遵循 GPL 协议的内核模块调用(因为 Linux 内核是 GPL 协议的)

4. 额外注意点

  • 头文件不用单独引:这两个宏定义在include/linux/export.h里,但内核模块的常用头文件module.h已经包含了export.h,所以写模块代码时,只要包含了#include <linux/module.h>,就可以直接用这两个宏。
  • 符号表的记录:导出的符号会被记录到内核的Module.symvers文件中(之前提到的那个文件),其他模块编译时需要依赖这个文件,才能找到导出的符号。

举个简单例子(帮助理解)

比如你写了两个模块:

  • 模块 A(导出方)

    c

    #include <linux/module.h> // 定义一个要导出的函数 void my_shared_func(void) { printk("这是模块A导出的函数\n"); } // 导出这个函数,供其他模块调用 EXPORT_SYMBOL(my_shared_func); // 模块加载/卸载函数(省略) module_init(xxx_init); module_exit(xxx_exit); MODULE_LICENSE("GPL");
  • 模块 B(调用方)

    c

    #include <linux/module.h> // 声明要调用的、模块A导出的函数 extern void my_shared_func(void); static int __init b_init(void) { my_shared_func(); // 直接调用模块A导出的函数 return 0; } module_init(b_init); MODULE_LICENSE("GPL");

当模块 A 先加载到内核,模块 B 再加载时,就能成功调用my_shared_func—— 这就是符号导出的实际作用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 16:15:44

出国点餐看不懂菜单?别慌!用微信“扫一扫”就能搞定

出国旅游最激动人心的环节之一就是品尝当地美食&#xff0c;但当服务员递上一份全是外文的菜单时&#xff0c;那种“既期待又怕点错菜”的纠结感瞬间涌上心头。是冒险“盲点”&#xff0c;还是比划着向服务员求助&#xff1f;其实大可不必如此狼狈&#xff01;你手机里的微信&a…

作者头像 李华
网站建设 2026/4/16 10:53:22

Nano Banana Pro:设计师的威胁,还是创意领域的新伙伴?

近几年&#xff0c;人工智能技术在各行各业的应用已经逐步渗透&#xff0c;特别是在创意设计领域&#xff0c;AI 已经不仅仅是一个辅助工具&#xff0c;更是正在迅速改变 创作流程 和 行业格局 的革命性力量。近日&#xff0c;谷歌推出的 Nano Banana Pro 一经发布&#xff0c;…

作者头像 李华
网站建设 2026/4/16 10:52:34

JavaScript事件循环:餐厅里的“宏任务”与“微任务”

欢迎使用我的小程序&#x1f447;&#x1f447;&#x1f447;&#x1f447; 俱好用助手功能介绍 大家好&#xff01;今天我们来聊聊JavaScript中那个让人又爱又恨的话题——事件循环中的宏任务和微任务。别担心&#xff0c;我不会用那些晦涩难懂的专业术语轰炸你&#xff0c;而…

作者头像 李华
网站建设 2026/4/16 11:50:58

Nano Banana Pro:交互哲学的“静默革命”——AI环境计算时代的开启

在过去的二十年里&#xff0c;我们与电脑、手机的交互都是基于“显式操作”的哲学&#xff1a;你点击、你输入、你等待。然而&#xff0c;谷歌 Nano Banana Pro&#xff08;NBP&#xff09;的突破&#xff0c;尤其是其极致的低延迟和本地部署潜力&#xff0c;正在催生一种全新的…

作者头像 李华