Linux内核代码中的“EXPORT_SYMBOL”是什么意思?

从这里

48 struct snd_card *snd_cards[SNDRV_CARDS]; 49 EXPORT_SYMBOL(snd_cards); 

我没有得到它的意义和为什么使用。 我试图search一下,但没有理解这个意思。

它使一个符号可以被动态加载的模块访问(假定所述模块添加了一个extern声明)。

不久前, 有人问如何使用它 。

根据我的评论,答案本身并不是一个答案,而是一个示范,导出的符号不需要是非静态的。 以下2个模块演示了这一点:

 /* mod1.c */ #include <linux/module.h> static int mod1_exp_func(int i) { pr_info("%s:%d the value passed in is %d\n", __func__, __LINE__, i); return i; } EXPORT_SYMBOL(mod1_exp_func); /* export static symbol */ static int __init mod1_init(void) { pr_info("Initializing simple mod\n"); return 0; } static void __exit mod1_exit(void) { pr_info("This module is exiting\n"); } module_init(mod1_init); module_exit(mod1_exit); MODULE_LICENSE("GPL v2"); 

而第二个模块

 /* mod2.c */ #include <linux/module.h> extern int mod1_exp_func(int); static int __init mod2_init(void) { pr_info("Initializing mod2\n"); pr_info("Calling exported function in mod1\n"); mod1_exp_func(3); return 0; } static void __exit mod2_exit(void) { pr_info("mod2 exiting\n"); } module_init(mod2_init); module_exit(mod2_exit); MODULE_LICENSE("GPL v2"); 

在CentOS 6和CentOS 7上测试了这些内核:2.6.32和3.10(分别)。 加载mod1.ko然后mod2.ko将导致传递给mod1_exp_func()的值被打印到内核日志缓冲区。