Модуль ядра


Модуль ядра, загружаемый модуль ядра (англ. loadable kernel module, LKM) — объектный файл, содержащий код, расширяющий функциональность запущенного или так называемого базового ядра ОС. Модули ядра используются, чтобы добавить поддержку нового оборудования или файловых систем или для добавления новых системных вызовов. Когда функциональность, предоставляемая модулем, больше не требуется, он может быть выгружен, чтобы освободить память и другие ресурсы.

Большинство современных Unix-систем и Windows поддерживают загружаемые модули ядра, хотя они могут использовать для них разные названия, например, kernel loadable module (kld) во FreeBSD, kernel extension (kext) в ОС OS X. Иногда их называют Kernel Loadable Modules (KLM), или Kernel Modules (KMOD).

Без загружаемых модулей ядра операционные системы должны были бы иметь всю возможную функциональность в монолитном ядре. Значительная часть кода не используется и лишь занимает память. Каждый раз, когда пользователю необходима новая функциональность, ещё не включенная в базовое ядро, требуется полная перекомпиляция базового ядра и перезагрузка. Использование подгружаемых модулей значительно упрощает изменение функциональности ядра и не требует ни полной перекомпиляции (модуль часто может быть собран отдельно от ядра или поставлен в предкомпилированном виде), ни перезагрузок.

Linux не обеспечивает стабильный API или ABI для модулей ядра. Это означает, что существуют различия во внутренней структуре и функции между разными версиями ядра, которые могут вызвать проблемы совместимости. В попытке борьбы с этими проблемами символ управления версиями данных помещается в .modinfo в разделе загружаемых ELF модулей. Эта информация о версии может быть сравнена с информацией версии исполняемого ядра перед загрузкой модуля; если версии несовместимы, то модуль не будет загружен.

Другие операционные системы, такие как Solaris, FreeBSD, Mac OS X, Windows, поддерживают API и ABI для модулей относительно стабильными, что позволяет избежать этой проблемы. Например, модули FreeBSD, скомпилированные под версию ядра 6.0, будет работать без перекомпиляции на любой другой версии FreeBSD 6.x, например, 6.4. Однако они не совместимы с другими основными версиями и должны быть перекомпилированы для использования с FreeBSD 7.x, так как совместимость API и ABI поддерживается только внутри одной ветви.

Загружаемые модули ядра являются удобным способом модифицировать ядро, это может быть использовано злоумышленником при взломе системы для предотвращения обнаружения его процессов или файлов, позволяя ему сохранить контроль над системой. Поэтому многие руткиты используют модули ядра.[1]