Модуль ядра
Модуль ядра, загружаемый модуль ядра (англ. 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]
LinuxПравить
В мире Linux модули загружаются и выгружаются утилитой modprobe. Модули хранятся в /lib/modules в файлах с расширением .ko («kernel object»), начиная с версии Linux 2.6.[2] В предыдущих версиях использовалось расширение .o. Команда lsmod показывает список загруженных модулей ядра и зависимости между ними.
Вопросы лицензированияПравить
По мнению хранителей Linux, LKM представляет собой производную работу от ядра. Функции ядра могут помечаться как доступные только для GPL модулей.
Загрузка собственнических или GPL-несовместимых модулей устанавливает флаг 'taint' (порча)[3] в ядре. Данный флаг означает, что какие-либо проблемы или баги имеют меньшие шансы на исследование хранителями ядра.[4][5] Модули фактически становятся частью работающего ядра и могут повредить внутренние структуры данных, создавая ошибки, которые не могут быть воспроизведены теми, кто не может загрузить проприетарный модуль.
Дело LinuxantПравить
В 2004 году консалтинговая компания Linuxant, выпускавшая проприетарный модуль (драйвер устройства) попыталась обойти ограничения «GPLONLY» на некоторые функции ядра. Для этого в исходном коде своего модуля в графе MODULE_LICENSE
был использован символ NUL:
MODULE_LICENSE ("GPL\0for files in the \"GPL\" directory; for others, only LICENSE file applies");
Определение лицензии ядром Linux производится путём лексикографического сравнения NUL-терминированных строк, поэтому сравнение указанной строки будет эквивалентно сравнению со строкой "GPL", в то время как модуль не распространяется по лицензии GPL.[6]
FreeBSDПравить
Модули ядра ОС FreeBSD хранятся в /boot/kernel/ (модули, распространяемые с дистрибутивом) или в /boot/modules/ для модулей, установленных из FreeBSD портов и других источников. Модули ядра FreeBSD обычно имеют расширение .ko. Модули могут подгружаться командой kldload, выгружаться kldunload. Список модулей виден по команде kldstat. Некоторые модули загружаются на этапе первичной загрузки (указываются в файле /boot/loader.conf).
Mac OS XПравить
Некоторые загружаемые модули ядра в Mac OS X могут быть загружены автоматически. Загружаемые модули ядра могут быть также загружены командой kextload. Список может быть выведен командой kextstat. Загружаемые модули ядра расположены в программных пакетах с расширением .kext. Модули поставляемые с операционной системой, хранятся в каталоге /System/Library/Extensions, модули от третьих лиц в других каталогах.
WindowsПравить
Ядро Windows само по себе не поддерживает расширения с помощью загружаемых модулей. Однако, поддерживаются загружаемые драйверы, а модуль, оформленный в виде драйвера Windows, не обязан работать с каким-либо внешним устройством. Благодаря этому, «псевдодрайверы» широко используются для изменения и расширения функциональности ядра Windows — анти-руткиты, перехватчики отладочного вывода, вспомогательные «агенты» многих системных программ, выпускаемых Sysinternals и т. п.
ПримечанияПравить
- ↑ Эксплуатация Загружаемых Модулей ядра (неопр.). Дата обращения: 5 мая 2012. Архивировано 4 февраля 2012 года.
- ↑ The Linux Kernel Module Programming Guide, section 2.2 "Compiling Kernel Modules" (неопр.). Дата обращения: 14 октября 2011. Архивировано 20 сентября 2012 года.
- ↑ Linus Torvalds, et all. Documentation/oops-tracing.txt (неопр.) (недоступная ссылка — история). kernel.org (21 июня 2011). Дата обращения: 3 октября 2011. Архивировано 20 сентября 2012 года.
- ↑ Jonathan Corbet. Tainting from user space (неопр.). LWN.net (24 марта 2006). Дата обращения: 3 октября 2011. Архивировано 16 ноября 2011 года.
- ↑ Novell support documentation: Tainted kernel (неопр.) (26 июля 2007). Дата обращения: 3 октября 2011. Архивировано 20 сентября 2012 года.
- ↑ Jonathan Corbet. Being honest with MODULE_LICENSE (неопр.). LWN.net (27 августа 2004). Дата обращения: 4 июня 2012. Архивировано 20 сентября 2012 года.
СсылкиПравить
- Олег Цилюрик. Модули ядра Linux (неопр.). — редакция 4.95 от 10.08.2011. Дата обращения: 9 ноября 2011.
- IBM DeveloperWorks in-depth article on LKM Архивная копия от 26 июля 2008 на Wayback Machine
- Online kext database for OS / Hackintosh
- Ori Pomerantz, Модули Ядра Linux Руководство По Программированию Архивная копия от 26 февраля 2018 на Wayback Machine
- «Kernel Extension Programming Topics» document for OS X Архивная копия от 9 апреля 2010 на Wayback Machine