17 Haziran 2021 Perşembe

Kernel Module ve Export Symbol

Giriş
Bir module bir başka modülün sadece exported sembollerine erişebilir. Açıklaması şöyle
Modules can only access exported symbols, and exit_task_namespaces isn’t exported — so even though it is visible in the header files, it can’t be used in a module.

Exported symbols can be accessed as you’d expect, there’s nothing special to do.
Örnek
Export edilen şey veri yapısı ise şöyle yaparız
struct snd_card *snd_cards[SNDRV_CARDS];
EXPORT_SYMBOL(snd_cards);
Örnek
modul1 şöyle olsun
/* 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");
module2 export edilen sembolleri kullanabilir. Şöyle yaparız
/* 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");

Hiç yorum yok:

Yorum Gönder