- •Типы архитектур ядер операционных систем Монолитное ядро
- •Подгружаемые модули
- •Модульное ядро
- •Микроядро
- •Архитектура микроядра, основанная на программах-серверах, работающих в пользовательском режиме
- •Устройство
- •Достоинства и недостатки
- •Поколения
- •История
- •Экзоядро
- •Наноядро
- •Пикоядро
- •Гибридное ядро
- •Примеры
- •Комбинация разных подходов
- •Загружаемый модуль ядра
- •Преимущества
- •Вопросы лицензирования
- •Дело Linuxant
- •Бинарная совместимость
- •Безопасность
- •Основные принципы функционирования
- •Наиболее известные представители данного класса по
- •Идеология построения драйверов
- •Сегментирование памяти
- •Условия и принцип защиты
- •Взаимодействие уровней привилегий
- •Переключение стека
- •Страничная память
- •Механизм ключей защиты
- •Симуляция сегментации Адресация основанная на Capability
- •Режим супервизора
- •Режим гипервизора
- •Режим системного управления (smm)
- •Модель взаимодействия между цп и уровнями абстракции ос
- •Системный вызов
- •Привилегии
- •Интерфейс системных вызовов
- •Промежуточная библиотека
- •Примеры и инструменты
- •Типичные имплементации
- •Категории системных вызовов
- •Режим процессора и переключение контекста
Примеры
Syllable
BeOS
Haiku
XNU (на основе Darwin, используется в Mac OS X)
BSD-основанные
DragonFly BSD (первое из семейства BSD микроядро, основанное не на Mach)
NetWare[3]
Plan 9
Inferno
NT kernel (используется Windows NT, 2000, 2003; XP, Vista, 7, 8)
ReactOS
Комбинация разных подходов
Все рассмотренные подходы к построению операционных систем имеют свои достоинства и недостатки. В большинстве случаев современные операционные системы используют различные комбинации этих подходов. Так, например, сейчас ядро «Linux» представляет собой монолитную систему с отдельными элементами модульного ядра. При компиляции ядра можно разрешить динамическую загрузку и выгрузку очень многих компонентов ядра — так называемых модулей. В момент загрузки модуля его код загружается на уровне системы и связывается с остальной частью ядра. Внутри модуля могут использоваться любые экспортируемые ядром функции.
Существуют варианты ОС GNU, в которых вместо монолитного ядра применяется ядро Mach (такое же, как в Hurd), а поверх него крутятся в пользовательском пространстве те же самые процессы, которые при использовании Linux были бы частью ядра. Другим примером смешанного подхода может служить возможность запуска операционной системы с монолитным ядром под управлением микроядра. Так устроены 4.4BSD и MkLinux, основанные на микроядре Mach. Микроядро обеспечивает управление виртуальной памятью и работу низкоуровневых драйверов. Все остальные функции, в том числе взаимодействие с прикладными программами, осуществляются монолитным ядром. Данный подход сформировался в результате попыток использовать преимущества микроядерной архитектуры, сохраняя по возможности хорошо отлаженный код монолитного ядра.
Смешанное ядро, в принципе, должно объединять преимущества монолитного ядра и микроядра: казалось бы, микроядро и монолитное ядро — крайности, а смешанное — золотая середина. В них возможно добавлять драйверы устройств двумя способами: и внутрь ядра, и в пользовательское пространство. Но на практике концепция смешанного ядра часто подчёркивает не только достоинства, но и недостатки обоих типов ядер.
Примеры: Windows NT, DragonFly BSD.
Загружаемый модуль ядра
Загружаемый модуль ядра (loadable kernel module, LKM) — объектный файл, содержащий код, расширяющий возможности ядра операционной системы. Модули используются, чтобы добавить поддержку нового оборудования или файловых систем или для добавления новых системных вызовов. Когда функциональность, предоставляемая модулем больше не требуется, он может быть выгружен, чтобы освободить память и другие ресурсы.
Большинство современных Unix систем, и Windows, поддерживают загружаемые модули ядра, хотя они могут использовать для них разные названия, например, kernel loadable module (kld) во FreeBSD, kernel extension (kext) в ОС OS X. Иногда их называют Kernel Loadable Modules (KLM), или Kernel Modules (KMOD).
Преимущества
Без загружаемых модулей ядра, операционные системы должны были бы включать всю возможную функциональность в базовом ядре. Значительная часть кода не используется и лишь занимает память. Каждый раз, когда пользователю необходима новая функциональность, ещё не включенная в базовом ядре, требуется полная перекомпиляция базового ядра и перезагрузка. Использование подгружаемых модулей значительно упрощает изменение функциональности ядра и не требует ни полной перекомпиляции (модуль часто может быть собран отдельно от ядра или поставлен в предкомпилированном виде) ни перезагрузок.
Windows
Ядро Windows само по себе не поддерживает расширения с помощью загружаемых модулей. Однако, поддерживаются загружаемые драйверы, а модуль, оформленный в виде драйвера Windows, не обязан работать с каким-либо внешним устройством. Благодаря этому, «псевдодрайверы» широко используются для изменения и расширения функциональности ядра Windows — анти-руткиты, перехватчики отладочного вывода, вспомогательные «агенты» многих системных программ, выпускаемых Sysinternals и т. п.
Linux
В мире Linux модули загружаются и выгружаются утилитой modprobe. Модули хранятся в /lib/modules в файлах с расширением .ko («kernel object»), начиная с версии Linux 2.6. В предыдущих версиях использовалось расширение .o. Команда lsmod показывает список загруженных модулей ядра и зависимости между ними.
