- Загружаемый модуль ядра
-
Загружаемый модуль ядра (loadable kernel module, LKM) — в информатике — объектный файл, содержащий код, расширяющий возможности ядра операционной системы. Модули используются, чтобы добавить поддержку нового оборудования или файловых систем или для добавления новых системных вызовов. Когда функциональность, предоставляемая модулем больше не требуется, он может быть выгружен, чтобы освободить память и другие ресурсы.
Большинство современных Unix систем, и Windows, поддерживают загружаемые модули ядра, хотя они могут использовать для них разные названия, например, kernel loadable module (kld) во FreeBSD, kernel extension (kext) в ОС OS X. Иногда их называют Kernel Loadable Modules (KLM), или Kernel Modules (KMOD).
Содержание
Преимущества
Без загружаемых модулей ядра, операционные системы должны были бы включать всю возможную функциональность в базовом ядре. Значительная часть кода не используется и лишь занимает память. Каждый раз, когда пользователю необходима новая функциональность, ещё не включенная в базовом ядре, требуется полная перекомпиляция базового ядра и перезагрузка. Использование подгружаемых модулей значительно упрощает изменение функциональности ядра и не требует ни полной перекомпиляции (модуль часто может быть собран отдельно от ядра или поставлен в предкомпилированном виде) ни перезагрузок.
Linux
В мире Linux модули загружаются и выгружаются утилитой modprobe. Модули хранятся в /lib/modules в файлах с расширением .ko («kernel object»), начиная с версии Linux 2.6.[1] В предыдущих версиях использовалось расширение .o. Команда lsmod показывает список загруженных модулей ядра и зависимости между ними.
Вопросы лицензирования
По мнению хранителей Linux, LKM — представляет собой производную работу от ядра. Функции ядра могут помечаться как доступные только для GPL модулей.
Загрузка собственнических или GPL-несовместимых модулей устанавливает флаг 'taint' (порча)[2] в ядре. Данный флаг означает, что какие-либо проблемы или баги имеют меньшие шансы на исследование хранителями ядра.[3][4] Модули фактически становятся частью работающего ядра и могут повредить внутренние структуры данных, создавая ошибки, которые не могут быть воспроизведены теми, кто не может загрузить собственнический модуль.
Дело Linuxant
В 2004 году, консалтинговая компания Linuxant, выпускавшая собственнический модуль (драйвер устройства) попыталась обойти ограничения «GPLONLY» на некоторые функции ядра. Для этого в исходном коде своего модуля в графе
MODULE_LICENSE
был использован символ NULL:MODULE_LICENSE ("GPL\0for files in the \"GPL\" directory; for others, only LICENSE file applies");
Ядро, при определении лицензии загружаемого модуля использует строковые функции и считает такую графу эквивалентной графе MODULE_LICENSE ("GPL") (то есть считает модуль использующим вирусную лицензию GPL), тогда как модуль не является GPL-лицензированным.[5]
FreeBSD
Модули ядра ОС FreeBSD хранятся в /boot/kernel/ (модули, распространяемые с дистрибутивом) или в /boot/modules/ для модулей, установленных из FreeBSD портов и других источников. Ядерные модули FreeBSD обычно имеют расширение .ko. Модули могут подгружаться командой kldload, выгружаться kldunload. Список модулей виден по команде kldstat. Некоторые модули загружаются на этапе первичной загрузки (указываются в файле /boot/loader.conf).
OS X
Некоторые загружаемые модули ядра в OS X могут быть загружены автоматически. Загружаемые модули ядра могут быть также загружены командой kextload. Список может быть выведен командой kextstat. Загружаемых модулей ядра расположены в программных пакетах с расширением .kext. Модули поставляемые с операционной системой и хранятся в каталоге /System/Library/Extensions, модули от третьих лиц в других каталогах.
Бинарная совместимость
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 поддерживается только внутри одной ветви.
Безопасность
Загружаемые модули ядра являются удобным способом модифицировать ядро, это может быть использовано злоумышленником при взломе системы для предотвращения обнаружения его процессов или файлов, позволяя ему сохранить контроль над системой. Поэтому многие руткиты используют модули ядра.[6]
См. также
- Загружаемый Модуль NetWare
- Модульное ядро
Источники
- ↑ The Linux Kernel Module Programming Guide, section 2.2 "Compiling Kernel Modules". Архивировано из первоисточника 20 сентября 2012. Проверено 14 октября 2011.
- ↑ Linus Torvalds, et all Documentation/oops-tracing.txt. kernel.org (21 июня 2011). Архивировано из первоисточника 20 сентября 2012. Проверено 3 октября 2011.
- ↑ Jonathan Corbet Tainting from user space. LWN.net (24 марта 2006). Проверено 3 октября 2011.
- ↑ Novell support documentation: Tainted kernel (26 июля 2007). Архивировано из первоисточника 20 сентября 2012. Проверено 3 октября 2011.
- ↑ Jonathan Corbet Being honest with MODULE_LICENSE. LWN.net (27 августа 2004). Архивировано из первоисточника 20 сентября 2012. Проверено 4 июня 2012.
- ↑ Эксплуатация Загружаемых Модулей ядра
Ссылки
- IBM DeveloperWorks in-depth article on LKM
- Online kext database for OS / Hackintosh
- Ori Pomerantz, Модули Ядра Linux Руководство По Программированию
- «Kernel Extension Programming Topics» document for OS X
- «HowTo: Загружаемый Модуль Ядра»
Аспекты операционных систем (история • список) Ядро Гибридное • Микро • Модульное • Монолитное • Нано • Экзо • Драйвер • Пространство пользователя • Область пользователя
Управление
процессамиРежимы (супервизора • реальный • защищённый) • Прерывание • Кольца защиты • Переключение контекста • Многозадачность (вытесняющая • кооперативная • мультипрограммирование) • Процесс • Управление процессом • Планировщик задач • Многопоточность
Управление
памятьюЗащита памяти • Сегментная адресация памяти • Страничная память • Менеджер виртуальной памяти • Ошибка сегментации • Общая ошибка защиты
Прочее Загрузчик ОС • API • VFS • Компьютерная сеть • GUI • Слой аппаратных абстракций (HAL)
Проект Linux Общее Adoption • Сравнение с Windows • Критика • GNU (Проект) • Ядро • История • The Linux Foundation • Закон Линуса • Именование • Tux
Распространение Приложения ALSA • Desktop • Devices • Embedded • Gaming • LAMP • Thin client
Персоналии Джоно Бэкон • Клаус Кноппер • Алан Кокс • Бенджамин Мако Хилл • Памела Джонс • Ари Лемке • Эндрю Мортон • Ян Мёрдок • Ханс Райзер • Скотт Джеймс Ремнант • Дэниел Роббинс • Марк Шаттлворт • Ричард Столлман • Линус Торвальдс • Теодор Тсо • Патрик Фолькердинг • Уоррен Вудфорд • Матт Циммерман
СМИ Enterprise open source journal • Free Software Magazine • Linux.com • Linux Format • Linux Gazette • Linux Journal • Linux-Magazin • Linux Magazine • Linux Medical News • Linux.org.ru • LWN.net • O3 Magazine • OpenNET • Phoronix
Списки Устройства • Дистрибутивы
Мобильность Прочее Группа пользователей • LSB • Revolution OS • SCO и Linux • Спор Таненбаума — Торвальдса • Вредоносные программы
Проект FreeBSD Связанные проекты FreeBSD Documentation License · FreeBSD Jail · FreeBSD Ports · Sysinstall Люди Маршалл Кирк Маккузик · Джордан Хаббард · Poul-Henning Kamp · Роберт Уотсон Производные ClosedBSD · DesktopBSD · FreeSBIE · m0n0wall · PC-BSD · pfSense · GNU/kFreeBSD · Gentoo/FreeBSD Категории:- Операционная система
- Ядро Linux
- FreeBSD
Wikimedia Foundation. 2010.