суббота, 16 мая 2015 г.

Alternative OS - Part 4: L4

В этой части будет рассказана общая история появления микроядер второго поколения а также про высокомодульные системы и собственно ядро L4. Т.к в настоящее время это ядро представляет собой интерес скорее как API и прототипы то будет рассказано также о наследии этого ядра.


Как рассказывалось в предыдущем разделе ядра Mach были первым шагом к созданию микроядерных ОС общего назначения. Т.к. ядра аналогичные Mach являются лишь одним вариантом создания микроядерных ОС, то логично предположить что были ещё и другие варианты архитектуры. Другим вариантом служит не просто выделение кода микроядра в отдельную сущность, но также и ограничение его полномочий, а также обязанностей связанных с работой операционной системы.
Данное микроядро не имеет даже возможности загружать систему и инициализировать периферию, по той причине что оно и не знает как это делать - данный код исключается из пространства ядра, делая его ещё более легковесным. На микроядре остаётся лишь управление памятью и потоками, а также передача сообщений (если быть точнее то инициализация и обеспечение обмена, т.к. сам обмен лежит на том потоке который принимает сообщение) - IPC.
Это позволило создать ядро имеющее такие размеры которые были бы достаточны для размещения ядра в СОЗУ процессора - процессорном кэше.
Первым человеком который задумался над данной задачей был Йохен Лидтке. Он в одиночку разработал первую спецификацию ядра L3, которое затем было преобразовано в L4. Кстати что примечательно L3 это ещё и название кэша процессора Intel для которого и создавалась первая версия ядра.

L4(англ L4)
Данное ядро, а в последствии и семейство ядер, можно охарактеризовать как ядра с небольшим по нынешним меркам объёмом кодовой базы (не более 20 тысяч строк на языке С или около 10 - 15 тысяч строк на языке С++). Также данному ядру присущая чёткая линия разделения кода на тот что входит в состав ядра и тот что принадлежит пространству пользователя. Всё это позволяет очень просто и быстро создавать необходимые уровни абстракции а также контролировать проект целиком, в отличии от разработки под ядро классических операционных систем, чей общий объём кода превышает десятки миллионов строк кода, порой делая любое изменение критичным и небезопасным.
После 1993 года количество различных ответвлений и форков ядра составляет целое семейство L4, которое объединяет L4 API (об нём мы поговорим позднее).

Основная ветка ядра на настоящий момент L4:Ka после смерти Йохена в 2001 году развивается гораздо медленней остальных, однако мне удалось после определённых трудностей собрать версию как для х86 так и для х86_64 архитектур:
Как вы можете видеть на картинке запуск ядра для х86, в эмуляторе QEMU. Версия ядра L4:Ka-Pistachio (более подробное описание). Для загрузки используется специализированный загрузчик KickStart который распределяет по регионам памяти компоненты системы. Помимо ядра ещё есть sigma0 - основная библиотека и набор служебных функций для работы системы. В качестве roottask может выступать любое приложение пользователя:
В данном случае я выбрал стандартный тест для ядер семейства L4 - L4Test suite. По причине того что автоматическое управление памятью исключено из ядра - оно отвечает только за безопасность и страничную память, то адреса расположения модулей пользователь должен выбрать сам (в более современных системах это делается автоматически).
Т.к L4:Ka разрабатывалось сравнительно давно то существует проблема совместимости с последними версиями компилятора GCC (у меня например стабильно работало на 4.8.3).

L4 API
Отдельно хочется поговорить по API ядра. Т.к. ядро L4 имеет небольшие размеры то для него составлено достаточно подробное API, которое описано в следующем документе. В нём подчёркнуто то каким образом следует взаимодействовать с ядром и какие оно предоставляет опции управления, также описаны требуемую функциональность для sigma0 и  приведены примеры для архитектур x86 и ppc (32 и 64 битных версий).
На основе этого документа были созданы различные форки и клоны оригинального L4 о которых мы поговорим в следующей части.

Итогом работы Лидтке стало современное микроядро, которое содержит весь необходимый для работы системы в целом функционал, при этом оставаясь компактным и позволяющее расширять возможности системы за счёт добавления необходимых блоков кода собранных в виде модулей.
Также L4 положило начало работы над гибридными операционными системами, и системами код которых частично включём в прошивку процессора для ускорения работы (по непроверенным источникам некоторые производители систем на чипе включают в свою прошивку ядро L4). Это произошло благодаря тому что ядро не имеет никаких обязательств и хаков относительно аппаратно-зависимого кода, а также полностью вынесенных в пространство пользователя код системного уровня и драйвера.

В следующей часты будут рассмотрены системы на базе ядер с L4 API, а также гибридные системы, содержащие в себе как классическую часть от систем общего назначения, так и компоненты от системы L4.