Подтвердить что ты не робот

Какой смысл "EXPORT_SYMBOL" в коде ядра Linux?

из здесь

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

Я не понимаю, что это значит и почему это используется. Я попытался найти его, но не понял смысла этого.

4b9b3361

Ответ 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(), будет напечатано в буферах журнала ядра.