当前位置: 首页 > news >正文

内核模块符号的导出

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—— 这就是符号导出的实际作用。

http://www.cnnetsun.cn/news/92048.html

相关文章:

  • 简单的创建一个Spring Boot网页
  • 鼠标滚轮缩放图片:前端实现高清无损放大技巧(附实战代码)
  • Numpy库实践2_索引和数组的操作
  • 图解 - 红黑树(插入)
  • Memgraph 全新 AI 图工具包:一键构建 GraphRAG 聊天机器人,实现快速上下文感知响应
  • 初始化列表和特殊成员
  • (二)前端基础框架构建
  • vLLM推理引擎教程6-Nsight Systems性能分析
  • 基于MATLAB的燃料电池汽车参数匹配与能量管理策略优化及仿真模型研究资料库
  • AM247L-0000伺服电机
  • DoraemonKit(DoKit)使用教程:从集成到实战
  • 构筑 AI 理论体系:深度学习 100 篇论文解读 第十九篇:序列建模的焦点——注意力机制 Attention Mechanism (2015)
  • 【小白笔记】移除元素与删除有序数组中的重复项与轮转数组(三步反转)
  • 什么是关键字驱动测试?
  • 前沿技术借鉴研讨-2025.12.16(超声心动图综述/妊娠期糖尿病/降低CTG解读主观性)
  • 别让发成绩,耗掉你课后的半小时
  • 企业级 Prompt 管理中心:实验分流 + 曝光埋点 + 可回溯,版本化/AB/DSL/可观测全齐
  • 执行 install.sh 报错 `env: ‘bash\r‘: No such file or directory` 怎么解决?
  • Part 10|我给这套系统划的第一个边界
  • agent-zh.md
  • 为什么过滤 rtmpt 而不是 rtmp?
  • Navicat x 达梦技术指引 | 启用和配置AI助手
  • Transformer的注意力权重的理解
  • 解构 Codigger:从内核到无限生态的“进化阶梯”
  • 基于Python的高考志愿报名推荐系统源码设计与文档
  • 飞桨PaddlePaddle入门与核心实践
  • 使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第四十讲)
  • 热销榜单:2025年高口碑数字人推荐,解决你的选择难题!
  • 应“双碳”考核!安科瑞通信机房能耗监测方案,让PUE管控精准落地
  • 1天净流入10亿!A500ETF南方凭什么成为布局中国核心资产的优选?