代码之家  ›  专栏  ›  技术社区  ›  Sagar Jain

Linux内核代码中的EXPORT_SYMBOL_GPL是什么?

  •  24
  • Sagar Jain  · 技术社区  · 11 年前

    Linux内核代码中的EXPORT_SYMBOL_GPL是什么?

    下面是一段代码,其中包含EXPORT_SYMBOL_GPL

    62 struct resource *platform_get_resource(struct platform_device *dev,
     63                                        unsigned int type, unsigned int num)
     64 {
     65         int i;
     66 
     67         for (i = 0; i < dev->num_resources; i++) {
     68                 struct resource *r = &dev->resource[i];
     69 
     70                 if (type == resource_type(r) && num-- == 0)
     71                         return r;
     72         }
     73         return NULL;
     74 }
     75 EXPORT_SYMBOL_GPL(platform_get_resource);
    

    该宏在内核代码中多次出现。。。

    1 回复  |  直到 9 年前
        1
  •  27
  •   Community CDub    4 年前

    宏将某些符号(例如函数)定义为可导出(从内核可加载模块中看到)。如果符号没有“EXPORT_symbol”,则无法从模块访问该符号。

    EXPORT_SYMBOL_GPL 将仅在GPL许可的模块中显示符号,并且 EXPORT_SYMBOL -在具有任何许可证的模块中。

    http://lwn.net/Articles/154602/ -关于EXPORT_SYMBOL_GPL的值(2005,corbet)

    当插入可加载模块时,它对内核函数和数据结构的任何引用都必须链接到当前运行的内核。然而,模块加载器不提供对所有内核符号的访问;只有那些已明确导出的才可用。

    出口有两种口味:香草味(EXPORT_SYMBOL)和仅GPL味(EXPORT _SYMBOL_GPL)。前者可用于任何内核模块,而后者不能用于任何没有GPL兼容许可证的模块。