Pertanyaan Apa arti dari "EXPORT_SYMBOL" dalam kode kernel Linux?


dari sini

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

Saya tidak mengerti apa artinya dan mengapa itu digunakan. Saya mencoba mencari tentang itu tetapi tidak memahami arti dari itu.


32
2018-03-23 09:08


asal


Jawaban:


Itu membuat simbol yang dapat diakses oleh modul yang dimuat secara dinamis (asalkan modul tersebut menambahkan extern pernyataan).

Beberapa waktu yang lalu, seseorang bertanya bagaimana cara menggunakannya.


35
2018-03-23 09:10



Bukan jawaban per se tapi demonstrasi, seperti yang dijanjikan dari komentar saya, bahwa simbol diekspor tidak harus non-statis. Modul 2 di bawah ini menunjukkan ini:

/* 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");

Dan modul kedua

/* 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");

Ini diuji pada CentOS 6 & CentOS 7: kernel 2.6.32 dan 3.10 (masing-masing). Memuat mod1.ko dan kemudian mod2.ko akan menghasilkan nilai yang diteruskan ke mod1_exp_func () yang dicetak ke buffer log kernel.


3
2017-08-18 15:11