Kernel review

Материал из Русский WINE
Перейти к: навигация, поиск

В этой статье содержится краткий обзор архитектур разных типов ядер.

Общая информация

Основными типами ядер являются следующие: монолитные ядра, микроядра и экзоядра.

В основном, они различаются компоновкой подсистем по отношению к ядру.

Ядро – это главная часть операционной системы. обладающая максимальными привилегиями. Она обеспечивает инфраструктуру для исполнения программ пользователя (пользователей): распределение памяти, процессорного времени, управляет вводом-выводом на устройства, обеспечивает средства для взаимодействия различных программ между собой.

Ядро исполняется с максимальными привилегиями, для компонентов ядра нет защиты памяти, они исполняются в едином адресном пространстве ядра и любой сбой в каком-то из компонентов ядра имеет фатальные последствия, может повредить другие компоненты, и поэтому обычно, ведет к остановке работы компьютера. Такая ситуация называется "Паникой ядра".

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

Типы архитектур ядер операционных систем

Монолитное ядро

Первоначально большое число компонентов ОС принято было включать в состав ядра. И планировщик процессов, и менеджер памяти, и файловые системы, и драйверы для улучшения производительности включали в состав ядра. Такие ядра принято называть монолитными. Наиболее известное ядро такого типа -- классическое ядро UNIX. Оно статически компоновалось в один большой файл ядра.

Но скоро стали ясны недостатки такого подхода:

  1. Для включения в состав ядра новых компонентов надо было пересобирать ядро;
  2. Незащищенность компонентов ядра друг от друга, т.к. в режиме ядра нет защиты памяти
  3. Сложность отладки, поскольку каждый компонент мог напрямую менять структуры других компонентов
  4. Поскольку ядро очень быстро росло в размерах (в основном, из-за драйверов), то вероятность ошибок в коде была очень велика

Поэтому были разработаны монолитные ядра с элементами модульности, что позволило (во время загрузки ОС или во время исполнения) загрузить добавочный кусок кода в режим ядра. Обычно это применялось для загрузки драйверов и файловых систем.

Микроядро

По указанным выше причинам, еще в 80-х годах XX века появилась идея переместить большинство компонентов ОС в пространство пользователя, оставив в ядре только минимальный набор компонентов. Такие минимальные ядра были названы микроядрами.

Преимущества такого подхода:

  1. Более модульный подход: добавлять компоненты ОС можно без постоянной пересборки одного большого бинарника
  2. Улучшенная защита компонентов друг от друга, т.к. они разнесены по разным адресным пространствам
  3. Более простая отладка ввиду изоляции и инкапсуляции ошибок в своем компоненте
  4. Разные компоненты могут общаться с другими компонентами только через жестко заданные интерфейсы, что также улучшило общую структуру и независимость компонентов друг от друга. Можно произвольно менять внутреннюю структуру компонентов, сохраняя их интерфейсы

Можно заметить, что этот подход согласуется с принципами модульного и объектно-ориентированного программирования

Есть, конечно, недостатки и у микроядерного подхода. Первые микроядра имели заметно меньшую производительность, чем монолитные ядра.

Причины этого состояли в том, что:

  1. очень многое было завязано на передаче сообщений микроядра, производительность которого оказывалась критичной
  2. в микроядрах частота изменения контекста и перехода из пользовательского режима в режим ядра была больше
  3. неэффективность кеширования кода ядра, частые случаи когда кода в кеше на нужный момент нет.

Это определило причины неудач первых микроядер, таких как микроядро Mach, разработанное Университетом Карнеги-Меллона.

В начале 1990-х гг были созданы микроядра 2-го поколения, в которых эти проблемы были решены (эти ядра, первым из которых было микроядро L4? конечно, все еще уступают в производительности монолитным ядрам, но всего на пару процентов). Это было достигнуто при помощи:

  1. оптимизации передачи сообщений, например, передачей маленьких сообщений внутри регистров процессора, а также передачей строк не копированием, а установкой временной области разделяемой памяти и передачей только ссылки
  2. смена контекста и переход из/в ядро также были оптимизированы
  3. микроядро было оптимизировано под каждую целевую архитектуру, так что реализация одних и тех же операций для разных процессоров делалась совершенно различными способами, более подходящими в данной ситуации.
  4. благодаря реализации принципа "Microkernels must be small", микроядро полностью помещается в L1-кеш процессора, что способствует эффективному кешированию
ReactOS
Search.png
Доклады
О ReactOSARWINSSЧеЗа
Информация Новости Выпуски новостейПереводы блоговНовости проектаВидеоReactOS на ХабреUSB от Вадима Галянта
Разработка Руководство по программированиюОтсутствующая функциональностьВетви разработкиКомпоненты системыReactOS и WineПлан работRoadmap ядра by VgalРазработчикиСовместимость с dll WindowsНаиболее значимые изменения за годИспользуемые проектыGoogle Summer of CodeИзвестные проблемы
Порты AMD64ARMXboxPowerPC
Компоненты Файловые системыРежим совместимостиОтчеты об ошибкахПечатьUSBЯдро
Загрузчик Восстановление MBRЗагрузка из GRUBПараметры загрузки
Прочее ARWINSSПриложения в ReactOSОформление ReactOSКоординаторы"Пасхальные яйца"Монетизация
Другое Типы ядерFreeWin95
Помощь
RAM-диск ReactOS по PXEс жесткого диска
Разработка Стиль написания кодаСтандарты RC-файловРабота с документациейВенгерская нотацияGNU Indent • [ Subversion : ветвислияниеиспользование TortoiseSVN ] • Основы переводаОтправка патчей
Репорты Отладка в VirtualBoxОтладка на экранДобавление программы в менеджер приложенийОтправка отчетов
Отладка Com0comGDBKdbgRossym.gdbRoswin.gdbWinDBGРуководство по WinDBGВключение трассировки ядраКоды DPRINTУдалённый отладчик ReactOS
Сборка CMakeRBuildФайлы RBuildАвтоматическое копирование файловСборка MINGW-w64Сборка модулейСреда сборки
Тестирование VirtualBoxVMwareQEMUHyper-VНеобходимый объём дискаПеренос файлов на виртуальный дискУстановка ReactOSУстановка драйверов
Сеть Общие папкиSambaNFS
Игры Установка DirectPlay
Обновление ReactOSЗагрузочная флешкаЧем можно помочь проектуСоздание нового пользователяЗвук и сеть в VirtualBoxСъемка и публикация видеоIRC-каналСторонние компонентыFAQReactOS как рабочая станцияReactOS и UEFI
Обзоры ОболочкаNTVDMWOWCommunity EditionИстория сайтаReactOS ServerКриптографияПО времен XP