Ядро Linux относится к категории так называемых монолитных – это означает, что большая часть функциональности операционной системы называется ядром и запускается в привилегированном режиме. Этот подход отличен от подхода микроядра,
когда в режиме ядра выполняется только основная функциональность
(взаимодействие между процессами [inter-process communication, IPC],
диспетчеризация, базовый ввод-вывод [I/O], управление памятью), а
остальная функциональность вытесняется за пределы привилегированной
зоны (драйверы, сетевой стек, файловые системы). Можно было бы
подумать, что ядро Linux очень статично, но на самом деле все как раз
наоборот.

Ядро Linux динамически изменяемое – это
означает, что вы можете загружать в ядро дополнительную
функциональность, выгружать функции из ядра и даже добавлять новые
модули, использующие другие модули ядра. Преимущество загружаемых
модулей заключается в возможности сократить расход памяти для ядра,
загружая только необходимые модули (это может оказаться важным для
встроенных систем).

Linux – не единственное (и не
первое) динамически изменяемое монолитное ядро. Загружаемые модули
поддерживаются в BSD-системах, Sun Solaris, в ядрах более старых
операционных систем, таких как OpenVMS, а также в других популярных ОС,
таких как Microsoft® Windows® и Apple Mac OS X.

Ресурсы.

рисунку 3). Основные операции удаления модуля показаны на рисунке 5.

Рисунок 5. Внутренний процесс выгрузки модуля (упрощенно).
Внутренний процесс выгрузки модуля (упрощенно).

При вызове функции ядра sys_delete_module
(с именем удаляемого модуля в качестве параметра) сначала выполняется
проверка того, имеет ли вызывающий соответствующие разрешения. Затем по
списку проверяются зависимости других модулей от данного модуля. При
этом используется список modules_which_use_me, содержащий
по элементу для каждого зависимого модуля. Если список пуст, т.е.
зависимостей не обнаружено, то модуль становится кандидатом на удаление
(иначе возвращается ошибка). Затем проверяется, загружен ли модуль.
Ничто не запрещает пользователю запустить команду rmmod
для модуля, который в данный момент устанавливается, поэтому данная
процедура проверяет, активен ли модуль. После нескольких дополнительных
служебных проверок предпоследним шагом вызывается функция выхода
данного модуля (предоставляемая самим модулем). В заключение вызывается
функция free_module.

К моменту вызова free_module
уже известно, что модуль может быть безопасно удален. Зависимостей не
обнаружено, и для данного модуля можно начать процесс очистки ядра.
Этот процесс начинается с удаления модуля из различных списков, в
которые он был помещен во время установки (sysfs, список модулей и
т.д.). Потом инициируется команда очистки, зависящая от архитектуры
(она расположена в ./linux/arch/<arch>/kernel/module.c). Затем
обрабатываются зависимые модули, и данный модуль удаляется из их
списков. В конце, когда с точки зрения ядра очистка завершена,
освобождаются различные области памяти, выделенные для модуля, в том
числе память для параметров, память для данных по процессорам и память
модуля ELF (core и
init).

Оптимизация ядра для управления модулями

Для
многих приложений необходима возможность динамической загрузки модулей,
но выгружать их не обязательно. Это позволяет ядру быть динамическим
при запуске (загрузка модулей в зависимости от обнаруженных устройств),
но неизменным во время работы. Если не требуется выгружать модули после
загрузки, можно сделать несколько усовершенствований для сокращения
количества кода, необходимого для управления модулями. В этом случае
можно отключить параметр настройки ядра CONFIG_MODULE_UNLOAD, удалив тем самым значительную часть функциональности ядра, связанную с выгрузкой модулей.

Дальнейшее изучение

Это
был лишь общий обзор процессов управления модулями в ядре. Лучшим
источником дополнительной информации об управлении модулями является
сам исходный код. Основные функции управления модулями содержатся в
./linux/kernel/module.c (и соответствующем файле заголовка
./linux/include/linux/module.h). Несколько функций, зависящих от
архитектуры, находятся в ./linux/arch/<arch>/kernel/module.c.
Наконец, функция автозагрузки ядра (которая автоматически загружает
модуль из ядра при необходимости) находится в файле
./linux/kernel/kmod.c. Эта функция включается при помощи параметра
настройки CONFIG_KMOD.

Самая свежая информация пищевые контейнеры на сайте. Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34