модуль ядра: extern, только если установлен определенный параметр - PullRequest
0 голосов
/ 16 мая 2019

Я хотел бы использовать функцию, определенную в другом модуле ядра. Обычно вы делаете это так:

другой модуль

void do_sth() {
  /* ... */
}
EXPORT_SYMBOL(do_sth);

my_module

extern void do_sth();

void some_function(void) {
  /* ... */
  do_sth();
  /* ... */

}

В моем случае я хочу использовать функцию do_sth() только в том случае, если установлена ​​other_module или, в качестве альтернативы, если для моего модуля установлен конкретный параметр (например, use_other_module=y)

Проблема в том, что - как только я объявлю функции как extern (глобально) - модуль больше не может быть загружен, когда other_module не установлен или не загружен.

Итак, мои вопросы:

  • Есть ли способ определить, экспортируется ли символ во время выполнения?
  • Есть ли способ определить символ глобально как внешний изнутри функции?

1 Ответ

0 голосов
/ 23 мая 2019

Основываясь на комментарии Иана Эбботта, вот одно из возможных решений:

In my_module :

  1. объявить функцию как extern, иначе компилятор пожалуется на do_sth в symbol_get ()

    extern void do_sth();
    
  2. объявить указатель, который позже будет указывать на функцию do_sth в другом модуле

    void (*__do_sth)();
    
  3. назначить указатель, увеличить счетчик использования, чтобы ядро ​​знало, что кто-то использует другой модуль

    __do_sth = symbol_get(do_sth);
    if (__do_sth)
        __do_sth();
    
  4. При удалении модуля или, возможно, раньше, когда вам больше не нужен другой модуль: Уменьшите счетчик использования. В противном случае будет невозможно удалить другой модуль, поскольку ядро ​​считает, что он все еще используется

    if (__do_sth)
        symbol_put(do_sth);
    
  5. Кроме того, вам нужно будет убедиться, что другой модуль каким-то образом загружен по мере необходимости, для этого я использую правило UDEV.

...