Необходимость использования MACROS, таких как module_init и module_exit, при написании загружаемых модулей ядра.

Какая необходимость в использовании макросов, таких как module_init и module_exit, при написании загружаемых модулей ядра? Кроме того, почему мы используем макросы, такие как __init или __exit. Хотя мы можем выполнять работу и без них.

  1. Без МАКРОСОВ

    /*
    Without using MACROS
    Author: Sricharan Chiruvolu
    Date: 14 Dec 2014
    */
    #include <linux/module.h>
    #include <linux/kernel.h>
    int init_module(void){
        printk(KERN_ALERT "This is our first program.");
        return 0;
    }
    void cleanup_module(void){
        printk(KERN_ALERT "End of our first program.");
    }
    
  2. С МАКРО

    /* 
    Edited first.c; Added macros module_init and module_exit
    Author: Sricharan Chiruvolu
    Date: 14 Dec 2014
    */
    #include <linux/module.h>
    #include <linux/kernel.h>
    #include <linux/init.h>
    
    static int __init first_init(void)
    {
        printk(KERN_ALERT "This is our first program.");
        return 0;
    }
    
    static void __exit first_exit(void)
    {
        printk(KERN_ALERT "End of our first program.");
    }
    
    module_init(first_init);
    module_exit(first_exit);
    

В чем разница?


person bittterbotter    schedule 14.12.2014    source источник
comment
возможный дубликат module_init и init_module из linux   -  person askb    schedule 14.12.2014


Ответы (1)


module_{init,exit}() добавляет необходимый шаблон для инициализации/очистки модуля и запуска кода входа/выхода, когда файл модуля загружается/выгружается в пространство ядра или из него.

__init сообщает ядру, что эта функция выполняется один раз и больше никогда не возвращается, в основном для встроенных драйверов, а module_init() предназначена для инициализации модуля, когда он находится в состоянии insmod.

Пригласите Рубини и Корбета

"

Атрибут __init, , приведет к отбрасыванию функции инициализации и освобождению ее памяти после завершения инициализации. Однако это работает только для встроенных драйверов; это не влияет на модули. __exit, вместо этого, приводит к пропуску отмеченной функции, когда драйвер не построен как модуль; опять же, в модулях это не имеет никакого эффекта.

Использование __init (и __initdata для элементов данных) может уменьшить объем памяти, используемой ядром. Нет никакого вреда в том, чтобы пометить функции инициализации модулей с помощью __init, хотя в настоящее время от этого тоже нет никакой пользы. Управление секциями инициализации для модулей еще не реализовано, но это возможное улучшение в будущем.

"

person askb    schedule 14.12.2014