- •Типы архитектур ядер операционных систем Монолитное ядро
- •Подгружаемые модули
- •Модульное ядро
- •Микроядро
- •Архитектура микроядра, основанная на программах-серверах, работающих в пользовательском режиме
- •Устройство
- •Достоинства и недостатки
- •Поколения
- •История
- •Экзоядро
- •Наноядро
- •Пикоядро
- •Гибридное ядро
- •Примеры
- •Комбинация разных подходов
- •Загружаемый модуль ядра
- •Преимущества
- •Вопросы лицензирования
- •Дело Linuxant
- •Бинарная совместимость
- •Безопасность
- •Основные принципы функционирования
- •Наиболее известные представители данного класса по
- •Идеология построения драйверов
- •Сегментирование памяти
- •Условия и принцип защиты
- •Взаимодействие уровней привилегий
- •Переключение стека
- •Страничная память
- •Механизм ключей защиты
- •Симуляция сегментации Адресация основанная на Capability
- •Режим супервизора
- •Режим гипервизора
- •Режим системного управления (smm)
- •Модель взаимодействия между цп и уровнями абстракции ос
- •Системный вызов
- •Привилегии
- •Интерфейс системных вызовов
- •Промежуточная библиотека
- •Примеры и инструменты
- •Типичные имплементации
- •Категории системных вызовов
- •Режим процессора и переключение контекста
Вопросы лицензирования
По мнению хранителей Linux, LKM — представляет собой производную работу от ядра. Функции ядра могут помечаться как доступные только для GPL модулей.
Загрузка собственнических или GPL-несовместимых модулей устанавливает флаг 'taint' (порча) в ядре. Данный флаг означает, что какие-либо проблемы или баги имеют меньшие шансы на исследование хранителями ядра. Модули фактически становятся частью работающего ядра и могут повредить внутренние структуры данных, создавая ошибки, которые не могут быть воспроизведены теми, кто не может загрузить проприетарный модуль.
Дело Linuxant
В 2004 году, консалтинговая компания Linuxant, выпускавшая проприетарный модуль (драйвер устройства) попыталась обойти ограничения «GPLONLY» на некоторые функции ядра. Для этого в исходном коде своего модуля в графе MODULE_LICENSE был использован символ NULL:
MODULE_LICENSE ("GPL\0for files in the \"GPL\" directory; for others, only LICENSE file applies");
Определение лицензии ядром Linux производится путем лексикографического сравнения NULL-терминированных строк, поэтому сравнение указаной строки будет эквивалентно сравнению со строкой "GPL", в то время как модуль не распространяется по лицензии GPL.
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 поддерживается только внутри одной ветви.
