Interested Article - Модуль ядра

Модуль ядра , загружаемый модуль ядра ( англ. 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 поддерживается только внутри одной ветви.

Безопасность

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

Linux

В мире Linux модули загружаются и выгружаются утилитой modprobe . Модули хранятся в /lib/modules в файлах с расширением .ko («kernel object»), начиная с версии Linux 2.6. В предыдущих версиях использовалось расширение .o . Команда показывает список загруженных модулей ядра и зависимости между ними.

Вопросы лицензирования

По мнению хранителей Linux, LKM представляет собой производную работу от ядра. Функции ядра могут помечаться как доступные только для GPL модулей.

Загрузка собственнических или GPL-несовместимых модулей устанавливает флаг 'taint' (порча) в ядре. Данный флаг означает, что какие-либо проблемы или баги имеют меньшие шансы на исследование хранителями ядра. Модули фактически становятся частью работающего ядра и могут повредить внутренние структуры данных, создавая ошибки, которые не могут быть воспроизведены теми, кто не может загрузить проприетарный модуль.

Дело 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 .

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 и т. п.

Примечания

  1. . Дата обращения: 5 мая 2012. 4 февраля 2012 года.
  2. . Дата обращения: 14 октября 2011. 20 сентября 2012 года.
  3. Linus Torvalds, et all. . kernel.org (21 июня 2011). Дата обращения: 3 октября 2011. Архивировано из 20 сентября 2012 года.
  4. Jonathan Corbet. . LWN.net (24 марта 2006). Дата обращения: 3 октября 2011. 16 ноября 2011 года.
  5. (26 июля 2007). Дата обращения: 3 октября 2011. 20 сентября 2012 года.
  6. Jonathan Corbet. . LWN.net (27 августа 2004). Дата обращения: 4 июня 2012. 20 сентября 2012 года.

Ссылки

  • Олег Цилюрик. . — редакция 4.95 от 10.08.2011 . Дата обращения: 9 ноября 2011.
  • от 26 июля 2008 на Wayback Machine
  • от 26 февраля 2018 на Wayback Machine
  • от 9 апреля 2010 на Wayback Machine
Источник —

Same as Модуль ядра