Linux - статьи

Hello World (часть 3): Макроопределения __init и __exit


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

То же относится и к макросу __initdata, но только для переменных.

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

Оба этих макроса определены в файле linux/init.h и отвечают за освобождение неиспользуемой памяти в ядре. Вам наверняка приходилось видеть на экране, во аремя загрузки, сообщение примерно такого содержания: Freeing unused kernel memory: 236k freed. Это как раз и есть результат работы данных макроопределений.

Пример 2-5. hello-3.c

/* * hello-3.c - Использование макроопределений __init, __initdata и __exit. */ #include <linux/module.h> /* Необходим для любого модуля ядра */ #include <linux/kernel.h> /* Здесь находится определение KERN_ALERT */ #include <linux/init.h> /* Здесь находятся определения макросов */

static int hello3_data __initdata = 3;

static int __init hello_3_init(void) { printk(KERN_ALERT "Hello, world %d\n", hello3_data); return 0; }

static void __exit hello_3_exit(void) { printk(KERN_ALERT "Goodbye, world 3\n"); }

module_init(hello_3_init); module_exit(hello_3_exit);



Содержание раздела