http://habrahabr.ru/post/221739/
Представляю рабочий порт
Inferno OS для Raspberry Pi.
Довольно долго было не так просто попробовать Inferno OS как «родную» ос а не в «hosted» режиме когда система запускается как процесс на Linux/Windows/MacOS/Plan9. Основная проблема этого в отсутствии широкого спектра драйверов для основных платформ да и легко доступный «hosted» режим.
Сначала наверно стоит немного приоткрыть завесу и сказать что такое Inferno OS и чем она хороша (Первое что спросят в комментариях! На хабре уже давно присутствует отличный цикл русскоязычных статей от powerman:
list, также его
блог).
Всё есть файл
Inferno OS система это идеологический наследник Plan9, поэтому понятно присутствие простой концепции: всё есть файл. Именно так, понятие API в каком-то смысле можно опустить. Например TCP стек — это виртуальные файлы, взаимодействуя с которыми открываются новые соединения, передаются данные через запись/чтение файлов. Переменные среды — каталог /env где файлы это переменный среды, и так далее…
Namespaces
Каждый процесс может создать свое собственное окружение для себя и своих потомков — вам нужна реализация «песочницы» без сети для приложений? — просто убирается /net из окружения определённых процессов-потомков. Так как всё взаимодействие с системой, другими приложениями и окружающей средой осуществляется через синтетические файлы то жонглируя окружением приложений можно реализовать диаметральный подход к разработке приложений — не приложение пытается подстроится к платформе анализируя окружение, оборудование, софт, а наоборот система даёт возможность настроить окружения под потребности приложения.
Dis, виртуальная машина и платформонезависимый байт-код
Dis это довольно интересный байт-код который «реализует» процессор без регистров, то есть asm команды Dis это команды вида mov mem1,mem2; add mem1,mem2,mem3; Трансляция подобных команд (JIT) оказывается очень быстрой и эффективной, так как каждой Dis инструкции соответствует всего пара-тройка команд процессора платформы. Есть даже проект по трансляции java байт-кода в байт-код Dis. По производительности отставание от такой же программы на C в тестах показывалось как всего 1.6-2 раза (хочу вскоре воспроизвести подобное тестирование чтобы подтвердить результаты)
Безопасность
Система проверок доступа в результате сводится к управлению доступом к файлам — пропадает головная боль по проверке сотен различных API на предмет уязвимостей. Это не означает отсутствие уязвимостей но даёт существенное упрощение системы безопасности в целом.
Программируя приложения для Inferno OS используются лёгкие нити, каналы — всё то с чем пришёл Go. Но в отличие от Go и Erlang и подобных присутствует фундаментальная возможность превратить любой канал приложения в синтетический файл. В результате каждое многопоточное приложение легко разрезается на отдельные процессы, приложения и при необходимости легко разносится на разные хосты. Именно поэтому основная практика написания приложений это не «поточное» приложение в unix-стиле которое ожидает
stdin, обрабатывает данные и выдаёт результаты в
stdout а приложение в стиле файл-сервер которое имеет виртуальные(синтетические) файлы для входящих данных, контроля и виртуальные файлы для вывода.
Универсальный сетевой протокол взаимодействия — 9p/Styx
Очень простой и эффективный протокол для организации соединения различных компонентов. Только одна конструктивная особенность — чувствительность к задержкам.
Если Inferno OS так хороша и легко запускается в «hosted» режиме то зачем нам «native» версия?
Тут самый интересный момент: в последние пару лет проснулся интерес к Inferno OS но не как к пользовательской системе а системе для использования в инфраструктуре «Internet of things». Как ни странно но именно inferno как компактная операционная система с универсальным протоколом 9p/styx для доступа ко всему и управления всем и универсальным Dis кодом идеально подходит для встраивания и использования в этой нише.
Многие SoC сейчас обладают тем что можно назвать «избыток» вычислительной мощности для задач для которых они предназначаются. Поэтому такие технологии как Dis/Limbo/Styx имеют преимущество даже при меньшей производительности чем аналоги на C. Плюс всегда есть несложная возможность вынести «вычислительную» часть в C-уровень ядра. Зато 9p/Styx позволяет легко реализовывать взаимодействие и объединение десятков и больше инферно-устройств в «умные» сети, легко пробрасывать вычисления между устройствами и так далее…
Теперь про сам порт.
Порт был начат не спеша и больше just for fun. И не ожидал что выльется в полноценный порт. Основная цель которую я ставил это задокументировать процесс портирования в виде
лаб чтобы потом максимально упростить адаптацию системы к новым чипам. После получения «Шарообразного Инферно в вакууме» (сезон 1, без драйверов совсем, но с таймерами чтобы работало переключение процессов итд) оказалось что многое из драйверов довольно несложно адаптируется из проекта Plan9 для Pi (9pi) – взялся за второй сезон и доведён порт до состояния чтобы запустить полноценно на RPi с сетью, клавиатурой мышью и графической оболочкой.
Оказалось что портирование системы на другой ARM чип довольно несложно.
Как результат теперь существует легкая возможность для пробы и изучения Inferno OS именно как «родной» системы на железе. Так как система очень компактна, код несложен в изучении (часть кода общая с Plan9), то эта операционная система легко модифицируема как раз для исследовательских задач (у меня есть пару горячих идей!). Думаю многих исследователей в области операционных систем это заинтересует.
PS. На определенное время эта ос была можно сказать забыта. Многие архитектурные решения в этой системе оказались опередившим своё время и просто невостребованными. Сейчас похоже ситуация меняется с приходом «internet of things».
Рекомендуемая литература:
1. Inferno Programming with Limbo. Phillip Stanley-Marbell.
2. Principles of Operating Systems: Design & Applications. Brian L. Stuart
3. Communicating Sequential Processes. Hoare, C. A. R.