Как вызвать макрос module_init?

Я пишу простой драйвер устройства char. Функция, которую мы передаем в module_init(), вызывается во время установки модуля.

Когда мы вставляем модуль с помощью команды insmod, вызывается функция, передаваемая в module_init().

Есть ли другой способ вызвать эту функцию module_init().


person beparas    schedule 20.07.2012    source источник


Ответы (1)


Если вы говорите об использовании чего-то другого, кроме insmod, то нет: insmod — это единственный известный мне способ инициализировать ваш модуль.

В противном случае эта вещь module_init является макросом и на самом деле не является вызовом функции (вы не можете вызывать функцию из глобальной области видимости в C). Он расширяется до некоторого предопределенного «конструктора модуля», который вызывает вашу функцию инициализации, в зависимости от того, компилируете ли вы как динамический модуль или как объект, встроенный в ядро. Его роль состоит в том, чтобы избежать #ifdef чрезмерных усилий при разработке модуля и упростить процесс разработки (см. -again.html" rel="nofollow">это).

Итак, если по какой-то причине (но я не рекомендую вам это делать) вы хотите вызвать свою функцию инициализации из кода вашего модуля, то просто вызовите ее напрямую. Например:

static void some_other_function(void) {
    // ...
    initialize();
    // ...
}

static int initialize(void) {
    // your initialization code
}

module_init(initialize);

Изменить: удалено __init после комментария Евгения.

Однако я рекомендую, чтобы только расширение module_init вызывало вашу функцию инициализации, а другой общий код находился в отдельной функции:

static void some_other_function(void) {
    // ...
    something_that_might_get_called_afterwards_also();
    // ...
}

static int __init initialize(void) {
    // your initialization code (done only once)
    something_that_might_get_called_afterwards_also();
    // some other one-time code
}

module_init(initialize);
person eepp    schedule 20.07.2012
comment
Если вы собираетесь вызывать initialize() из этого примера сразу после завершения инициализации модуля, я полагаю, лучше не помечать его __init. Помеченные таким образом функции (а также данные, помеченные __init_data) выгружаются из памяти загрузчиком после завершения инициализации модуля. Поэтому вызов их после этого приведет к ошибке ядра. Если они не отмечены __init, они останутся в памяти и могут быть вызваны. Но я согласен с @eepp, лучше так не делать, а использовать отдельную функцию. - person Eugene; 21.07.2012