Project

General

Profile

Аппаратное микроядро

Added by alman about 11 years ago

Добрый день.

Меня пригласили в это сообщество в одной из конференций IXBT: http://forum.ixbt.com/topic.cgi?id=8:24130-66#1569

Распишите, если не трудно, подробнее о том, что вы предлагаете реализовать в железе и о возможности портирования вашей ОС на процессор без MMU, но с контроллером памяти.

Основной документ, описывающий все аспекты микроядра L4-X2, находится здесь: http://l4ka.org/l4ka/l4-x2-r7.pdf

На основе более чем 10 летнего использования микроядра L4 Pistachio, появилось представление о том, каким образом аппаратно реализовать спецификацию L4. В результате было создано описание аппаратного планировщика: https://docs.google.com/file/d/0Bzo8HAmNqHgAQ1BJeEc5SmZQaUE/edit?usp=sharing В настоящий момент мы работаем над новой расширенной и исправленной ревизией этого документа.

Говоря простым языком, необходима возможность синхронно передать 64 машинных слова между задачами. В данном случае под задачей подразумевается последовательность инструкций процессора, использующая регистры общего назначения, счётчик команд, указатель стека и флаги.

Заранее прошу прощения у разработчиков процессора Multiclet, если в этом посте продемонстрирую непонимание приниципов его работы.

Рассматривая процессор Multiclet, самым простейшим решением будет передача блока регистров сообщений между клетками. В таком случае получим схему, где каждая клетка выполняет одну единственную задачу. Однако, это простейшее решение не будет оптимальным в виду синхронности. Поясню на простом примере - допустим, пользовательская задача выполняется на одной клетке, а ядро системы на другой. Простейший системный вызов, например чтение данных, в виду свойства синхронности сообщений, заблокирует пользовательскую клетку до получения ответа - таким образом получаем простой пользовательской клетки во время выполнения операции чтения клеткой, выполняющей функции ядра. Решением проблемы "простоя в ожидании" может быть переключение контекста, то есть всякий раз, когда клетка блокируется в ожидании какого либо события, её можно использовать для выполнения другой задачи. Для этого необходимо каким-то образом переключить контекст - сохранить регистры текущей задачи и загрузить регистры другой задачи, незаблокированной в ожиданнии, имеющей наивысший приоритет и имеющей неиспользуемый квант времени. Частный случай такой схемы - задача инициатор сообщения и задача приёмник сообщения выполняются на одной и той же клетке.

Для переключения задач могут быть задействованы различные способы, это могут быть блоки регистров, которые коммутируются к клетке, это может копирование регистров в какой либо внутренний кэш или во внешнюю память, а так же может быть комбинация различных методов - с точки зрения программы это несущественно, а важно лишь то, что операция переключения задач может произойти лишь во время обработки сообщения. С точки зрения L4, принципиальный момент в том, что внешние прерывания и аппаратные исключения - это тоже сообщения. Таким образом сообщения являются базовым принципом взаимодействия задач и основным инструментом управления процессором.

Свойство синхронности сообщений описывается следующим правилом: "Сообщение может быть передано тогда и только тогда, когда принимающая задача находится в состоянии ожидания сообщения". В противном случае передатчик сообщения блокируется до готовности приёмника сообщения или до истечения таймаута, указанного в сообщении. Для приёмника сообщения действует то же самое правило - он блокируется до приёма сообщения или до истечения указанного таймаута. Время тайматуа задаётся логарифмической величиной с граничными значениями "не ждать" и "ожидать сообщение". В случае нулевого таймаута ("не ждать"), сообщение может быть передано только при условии, что приёмник уже находится в состоянии ожидания, в противном случае команда передачи сообщения вернёт ошибку "Превышено время ожидания ответа". Эта же ошибка будет возвращена, если за время таймаута сообщение не было принято или передано.

Оригинальный документ (l4-x2-r7.pdf) определяет три типа данных, которые могут быть переданы в сообщениях - простые нетипизированные слова, строки (в том числе составные) и универсальные страницы памяти.

  • Спецификация l4-x2 определяет способ отображения физической страницы памяти в виртуальное адресное пространство задачи через операцию передачи сообщений - если задача владеет страницей памяти и помещает её описатель в сообщение (типизированное слово), то это сообщение производит отображение передаваемой страницы в виртуальное адресное пространство задачи приёмника. Отсутствие MMU исключает возможность передачи универсальных страниц памяти (flexpages).
  • Спецификация l4-x2 называет строкой блок памяти, который описывается указателем на начало блока и длиной блока. Составные строки могут описывать несколько несмежных блоков памяти. Во время передачи сообщения эти блоки (определены типизированными словами) копируются из адресного пространства задачи источника сообщения, в адресное пространство задачи приёмника сообщения, по адресам, назначенным строкой акцептором.

Минимальная реализация может использовать лишь простую передачу нетипизированных слов между клетками. Отстутствие адресных пространств так же исключает необходимость передачи строк - в данном случае можно передавать обычные указатели на блоки памяти и их размер посредством нетипизированных слов в сообщениях.

Что касается возможности портирования на процессор без MMU, то это возможно, но с уходом от POSIX совместимости. Существет главный системный процесс Supervisor, который на основе примитивов L4 реализует управление процессами и виртуальной памятью, попутно реализуя часть стандарта POSIX (fork, exec, sbrk, signal и т.п.). Без виртуальной памяти о POSIX совместимости можно забыть - и копию процесса не создать, и кучу не увеличить. Супервизор сильно завязан на "универсальные виртуальные страницы" и в полную силу использует возможности витуальной памяти.

Гораздо оптимистичнее обстоят дела с файловой системой, сетевым стеком и драйверами устройств - они минимально зависимы от виртуальной памяти, а если где и используют динамическое выделение памяти, то практически всегда имеют альтернативную реализацию аллокаторов памяти из статического пула.
Т.е. запустить операционную систему на процессоре без MMU возможно, но при этом будет нарушена POSIX совместимость. В настоящий момент система по функциональности лишь приближается к раннему стандарту POSIX, а отстутствие виртуальной памяти ещё дальше отодвинет систему от этого стандарта.


Replies (6)

RE: Аппаратное микроядро - Added by krufter_multiclet about 11 years ago

С документацией по вашей ОС внимательно ознакомимся и проанализируем все возможности по установке ОС в аппаратной и программной частях. Если же брать в расчёт ОС под процессор без MMU, то существует ещё микро Линукс и др., но ваша ОС, как я понимаю на первый взгляд, будет предпочтительнее. Вопросы по ОС будем задавать в сообщениях данной ветки форума или у вас на сайте.

RE: Аппаратное микроядро - Added by xxx_ about 11 years ago

krufter_multiclet wrote:

Если же брать в расчёт ОС под процессор без MMU, то существует ещё микро Линукс и др.

Без MMU работает Singularity и Inferno-OS. Благодаря SIP. Для запуска нативной Inferno-OS нужен как минимум 1Mb ОЗУ.

Ну и кстати по производительности L4. Весь фетиш из-за IPC. Но у L4 более низкая производительность IPC, по сравнению с Barrelfish, например, у которой они в юзерспейсе. На сколько читал, в том числе из-за меньшего футпринта в кеше. Но у вас нету кеша.

RE: Аппаратное микроядро - Added by krufter_multiclet about 11 years ago

В новой версии процессора можно будет потестировать Inferno, ОЗУ хватит. Кеша не будет и в новой версии. Barrelfish больше подходит для многоядерных систем, хотя можно подумать и над применением в мультиклеточном процессоре.

RE: Аппаратное микроядро - Added by alman about 11 years ago

Без MMU работает Singularity и Inferno-OS. Благодаря SIP. Для запуска нативной Inferno-OS нужен как минимум 1Mb ОЗУ.

Простите, что такое SIP? Yandex и Google направляют по ложному следу на коммуникационный протокол.
Кстати, в Сети очень мало информации о нативном режиме Inferno-OS, а готовый образ для VirualBox илb VMWare найти не удалось. Есть некоторые сомнения, что в нативном режиме всё так же хорошо как и в режиме hosted.

Ну и кстати по производительности L4. Весь фетиш из-за IPC. Но у L4 более низкая производительность IPC, по сравнению с Barrelfish, например, у которой они в юзерспейсе. На сколько читал, в том числе из-за меньшего футпринта в кеше. Но у вас нету кеша.

В Barrelfish передача сообщений между ядрами реализована через shared память. Идея интересная, но (имхо) не подходит для мультиклеточного процессора. Если не ошибаюсь, в мультиклете всё адресуемое адресное пространство и так общее для всех клеток? В этом случае нет смысла копировать сообщение в промежуточный буфер, а достаточно лишь передать между клетками указатель на этот буфер.

Скорее всего я плохо представляю что же такое "клетка". Всё рассуждения вёл относительно того, что каждая клетка это комбинация ALU, регистров и устройства выборки команд. Но, похоже, я ошибаюсь. Вероятно, для программиста будет проще считать всё множество клеток как единственное ядро, в котором распараллеливание происходит на уровне команд, а не на уровне нитей/процессов. В таком случае можно реализовать многозадачность как в старые добрые времена - программно, через вход в планировщик, который переключяет задачи. Пожалуй, самый принципиальный момент в том, что процедура передачи сообщений реализуется именно через вход в планировщик. И уже фишка конкретно микроядра L4 - это прерывания и исключение реализованы в виде сообщений.

Barrelfish больше подходит для многоядерных систем, хотя можно подумать и над применением в мультиклеточном процессоре.

На Barrelfish огромное влияние оказало L4 Pistachio. Это очень хорошо видно как в исходном коде, так и в документе "The Multikernel: A new OS architecture for scalable multicore systems" - авторы сравнивают свою систему именно с Pistachio. К тому же, авторы Barrelfish прямым текстом говорят, что организация памяти взята из seL4.

RE: Аппаратное микроядро - Added by krufter_multiclet about 11 years ago

Вероятно, для программиста будет проще считать всё множество клеток как единственное ядро
Если не ошибаюсь, в мультиклете всё адресуемое адресное пространство и так общее для всех клеток?

Именно так

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

В новой версии процессора возможно будет кое-что интересное и в аппаратной части, но надо дождаться выхода новой версии.
Операционные системы будем разные портировать и смотреть на результат работы.

P.S. по SIP ftp://ftp.research.microsoft.com/pub/tr/TR-2006-43.pdf

RE: Аппаратное микроядро - Added by krufter_multiclet about 11 years ago

alman вы можете рассказать какие основные черты должен иметь MMU для того, чтобы запустить вашу ОС Хамелеон? Т.е. что должен уметь делать блок MMU для того, чтобы получить работающее в нормальном режиме микроядро L4 Pistachio.

    (1-6/6)