zoukankan      html  css  js  c++  java
  • 内核分析:EXPORT_SYMBOL解析


    Kernel. EXPORT_SYMBOL解析
     
    Code Segment:
     
    include/module.h:
     
    struct kernel_symbol
    {
        unsigned long value;   
        const char *name;
    };

    /* For every exported symbol, place a struct in the __ksymtab section */
    #define __EXPORT_SYMBOL(sym, sec)               \
        __CRC_SYMBOL(sym, sec)                  \
        static const char __kstrtab_##sym[]         \
        __attribute__((section("__ksymtab_strings")))       \
        = MODULE_SYMBOL_PREFIX #sym;                        \
        static const struct kernel_symbol __ksymtab_##sym   \
        __attribute_used__                  \
        __attribute__((section("__ksymtab" sec), unused))   \
        = { (unsigned long)&sym, __kstrtab_##sym }

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

    #define EXPORT_SYMBOL_GPL(sym)                  \
        __EXPORT_SYMBOL(sym, "_gpl")

    #endif

     
    Analysis:
     
    1. kernel_symbol: 内核函数符号结构体
    value: 记录使用EXPORT_SYMBOL(fun),函数fun的地址
    name: 记录函数名称("fun"),在静态内存中
     
    2. EXPORT_SYMBOL(sym) :导出函数符号,保存函数地址和名称
     
    宏等价于:(去掉gcc的一些附加属性,MODULE_SYMBOL_PREFIX该宏一般是"")
     
    static const char __kstrtab_sym[] = "sym";
    static const struct kernel_symbol __ksymtab_sym =
        {(unsigned long)&sym, __kstrtab_sym }
     
     
    3. gcc 附加属性

    1>. __atrribute__ 指定变量或者函数属性。在此查看详细http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Variable-Attributes.html#Variable-Attributes
     
    __attribute((section("section-name")) var : 编译器将变量var放在section-name所指定的data或者bss段里面。
     
    很容易看出:EXPORT_SYMBOL(sym)将sym函数的名称__kstrtab_sym记录在,段名为"__kstrtab_strings"数据段中。 将sym所对应的kernel_symbol记录在名为__ksymtab段中。
    EXPORT_SYMBOL_GPL(sym) 和EXPORT_SYMBOL不同之处在于sym对应的kenel_symbol记录在__ksymtab_gpl段中。
  • 相关阅读:
    秒杀系统核心高性能解决方案(待续)
    LeetCode字符串专题
    LeetCode哈希表专题
    LeetCode排序专题【算法】
    Login项目学习笔记【Android】
    LeetCode树专题(遍历,BST,Trie)(未完成)
    Android studio导入别人项目的艰难记录
    LeetCode树专题(递归)(未完成)
    LeetCode双指针专题【算法】(未完成)
    LeetCode数组与矩阵专题(未完成)
  • 原文地址:https://www.cnblogs.com/mywolrd/p/1930696.html
Copyright © 2011-2022 走看看