Первые версии микроядра L4 были настолько малы, что могли целиком поместится в кэше современных процессоров. Вероятно, этот факт породил миф о микроядре L4: «Оно быстрое, потому что маленькое». Даже в настоящее время нередко можно услышать эту версию. Так можно ли разместить микроядро в процессоре и как это сделать?
Чтобы ответить на вопрос, как поместить микроядро в кристалл, необходимо представить, что же такое микроядро L4 и какие функции оно выполняет. Можно смело сказать, что L4 держится на трёх китах:
- Любое взаимодействие между задачами происходит на основе сообщений, в т.ч. аппаратные прерывания и внутренние исключения
- Сообщения синхронны и только синхронны — в передаче сообщения участвуют обе задачи
- Универсальные страницы виртуальной памяти заменяют традиционные виртуальные страницы.
В результате родился документ с довольно скучным описанием регистров, алгоритмов и рекомендаций:
Формальное описание аппаратного микроядра L4 (L4_Hard_20130119.pdf, 1046Кб)
Документ описывает расширение системы команд микропроцессоров для реализации аппаратной поддержки микроядра L4 ревизии X2 и совместимых спецификаций. Документ основываетя на следующих соглашениях
- Задача это последовательность команд, обрабатываемая исполнительным устройством.
- Каждая задача имеет собственный «Блок регистров задачи» и однозначно определяется и описывается им.
- Процесс – это одна или несколько задач, разделяющие одну и ту же таблицу страниц
- Поток – это задача, исполняющаяся в адресном пространстве какого-либо процесса.
- Планировщик – функциональный блок микропроцессора, расширяющий систему команд и предоставляющий возможность обмена синхронными сообщениями между задачами.
Документ описывает реализацию аппарантного планировщика, совместимого с L4-X2. Предложенная версия документа исправлена с учётом нескольких обсуждений:
Дайджест обсуждения «Отечественные микропроцессоры (2) (часть 2)»
Аппаратное микроядро. Final discussion
Дайджест обсуждения «Отечественные микропроцессоры (2) (часть 3)»
Миниатюра, описывающая регистры задачи:
Предлагается использование большого регистрового файла, который поделен на две части — одна часть содержит массив, каждый элемент которого является блоком регистров задачи. Вторая часть большого регистрового файла содержит массив, каждый элемент которого является буфером сообщения. Также добавляется несколько глобальных регистров планировщика. Переключение задач осуществляется коммутацией блока регистров с исполнительным устройством. Передача сообщений осуществляется перекоммутаций буфера сообщений от задачи источника задаче приёмнику.
Надеюсь, документ вызовет интерес у уважаемого сообщества. Идеи, которые возникунт в результате обсуждения, будут внесены в следующую версию документа. Приятного чтения!
Автор: alman