当前位置:首页 > 公众号精选 > 嵌入式客栈
[导读][导读] 写驱动时,常常遇到EXPORT_SYMBOL,这究竟做了啥,对于做底层开发而言,了解其内在实现机制,对于开发还是很有益的。本文就来剖析一下其内在实现机制及其作用。从本文开始,将开始不定期更新阅读内核代码的笔记,内核代码庞大,且限于水平,如发现错误

[导读] 写驱动时,常常遇到EXPORT_SYMBOL,这究竟做了啥,对于做底层开发而言,了解其内在实现机制,对于开发还是很有益的。本文就来剖析一下其内在实现机制及其作用。从本文开始,将开始不定期更新阅读内核代码的笔记,内核代码庞大,且限于水平,如发现错误,文末开了个小程序留言功能进行讨论,真诚欢迎讨论交流。让我们一起来阅读内核代码吧~~~

概要介绍

内核代码中几个常见用于导出符号的宏为:

#define EXPORT_SYMBOL(sym)
#define EXPORT_SYMBOL_GPL(sym)
#define EXPORT_SYMBOL_GPL_FUTURE(sym)
#define EXPORT_UNUSED_SYMBOL(sym)
#define EXPORT_UNUSED_SYMBOL_GPL(sym)

其作用分别为:

  • EXPORT_SYMBOL:导出一般符号,用于使内部符号变成可加载模块。可加载模块的含义是可以通过命令insmod 动态加载内核模块。

  • EXPORT_SYMBOL_GPL:导出只兼容GPL License的符号,这些符号仅对具有GPL兼容许可证的模块可用。GPL-only符号的可能意图:

  • 已有符号,限定使用该符号的模块都只能是内核的派生产品。

  • 对于新创建的符号,其创建者可以通过这个机制限定其仅适用于GPL。

  • EXPORT_SYMBOL_GPL_FUTURE ,其目的是标记将来可能被更改为GPL-only导出的符号。如果非GPL模块使用了此类符号,则内核将发出警告,表明该模块将在将来的某个时间中断。幸运的是,这些警告将帮助专有模块的作者提前为更改做好准备。

  • EXPORT_UNUSED_SYMBOL, EXPORT_UNUSED_SYMBOL_GPL这两个基本没用,估计是预留接口。

以内核调度器举例,先不关心函数内部实现细节。

asmlinkage __visible void __sched schedule(void)
{
    struct task_struct *tsk = current;

    sched_submit_work(tsk);
    do {
        preempt_disable();
        __schedule(false);
        sched_preempt_enable_no_resched();
    } while (need_resched());
}
EXPORT_SYMBOL(schedule);

其中:EXPORT_SYMBOL 宏定义为:

#define EXPORT_SYMBOL(sym)                    \
    __EXPORT_SYMBOL(sym, "")

而__EXPORT_SYMBOL 的宏定义为:

#define __EXPORT_SYMBOL(sym, sec)                                \
    extern typeof(sym) sym;                                     \
    __CRC_SYMBOL(sym, sec)                                      \
    static const char __kstrtab_##sym[]                         \
    __attribute__((section("__ksymtab_strings"), aligned(1)))   \
    = VMLINUX_SYMBOL_STR(sym);                                  \
    extern const struct kernel_symbol __ksymtab_##sym;          \
    __visible const struct kernel_symbol __ksymtab_##sym        \
    __used                                                      \
    __attribute__((section("___ksymtab" sec "+" #sym), unused)) \
    = { (unsigned long)&sym, __kstrtab_##sym }

而__CRC_SYMBOL的宏定义为:

#define __CRC_SYMBOL(sym, sec)                                     \
    extern __visible void *__crc_##sym __attribute__((weak));    \
    static const unsigned long __kcrctab_##sym                   \
    __used                                                       \
    __attribute__((section("___kcrctab" sec "+" #sym), unused))  \
    = (unsigned long) &__crc_##sym;

这里还有个VMLINUX_SYMBOL_STR宏,其定义如下:

/* Some toolchains use a `_' prefix for all user symbols. */
#ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX
#define __VMLINUX_SYMBOL(x) _##x
#define __VMLINUX_SYMBOL_STR(x) "_" #x
#else
#define __VMLINUX_SYMBOL(x) x
#define __VMLINUX_SYMBOL_STR(x) #x
#endif

#define VMLINUX_SYMBOL_STR(x) __VMLINUX_SYMBOL_STR(x)

假定CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX定义了,则全部展开为:


那么全部展开后,得到了什么呢?

    extern typeof(schedule) schedule;                                    \
    extern __visible void *__crc_schedule __attribute__((weak));         \
    static const unsigned long __kcrctab_schedule                        \
    __used                                                               \
    __attribute__((section("___kcrctab" sec "+" "schedule"), unused))    \
    = (unsigned long) &__crc_schedule;      
   static const char __kstrtab_schedule[]                                \
    __attribute__((section("__ksymtab_strings"), aligned(1)))            \
    = "_" "schedule";                                                    \
    extern const struct kernel_symbol __ksymtab_schedule;                \
    __visible const struct kernel_symbol __ksymtab_schedule              \
    __used                                                               \
    __attribute__((section("___ksymtabsec "+" "schedule"), unused))    \
    = {
 (unsigned long)&schedule, __kstrtab_schedule };    

这样还是不直观,去掉不必要的换行符,整理一下:

asmlinkage __visible void __sched schedule(void)
{
    struct task_struct *tsk = current;

    sched_submit_work(tsk);
    do {
        preempt_disable();
        __schedule(false);
        sched_preempt_enable_no_resched();
    } while (need_resched());

/*以下部分都属于EXPORT_SYMBOL(schedule)的展开*/
extern typeof(schedule) schedule;
extern __visible void *__crc_schedule __attribute__((weak));

static const unsigned long __kcrctab_schedule __used                 \
__attribute__((section("___kcrctab" sec "+" "schedule"), unused))    \
= (unsigned long) &__crc_schedule;     

static const char __kstrtab_schedule[] __attribute__((section("__ksymtab_strings"), aligned(1)))  = "_" "schedule";                                     

extern const struct kernel_symbol __ksymtab_schedule; 

__visible const struct kernel_symbol __ksymtab_schedule __used __attribute__((section("___ksymtabsec "+" "schedule"), unused)) = { 
    (unsigned long)&schedule, __kstrtab_schedule 
}; 

EXPORT_SYMBOL(schedule)展开成这么一个玩意儿,要理解其内在机制,这里涉及到了很多内核代码关键词,比如:

  • asmlinkage

  • __visible

  • extern typeof(schedule) schedule

  • kernel_symbol

  • ……

这个且待下回分解。

点击留言/查看留言

END

果喜欢右下点个在看,也会让我倍感鼓舞

往期精彩推荐




▲深度解析U-Boot网络实现(长篇好文)
读U-Boot源码-C语言编程大法总结篇一
读U-Boot源码-C语言编程技巧总结篇二
基于Buildroot的Linux系统构建之根文件系统
手把手教系列之移动平均滤波器C实现
手把手教系列之IIR数字滤波器设计实现

关注置顶:扫描左下二维码关注公众号加星

讨论加群:扫描右下二维码添加,发送“加群”

关注

加群

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭