Дмитрий Завалишин рассказал о проекте по портированию виртуальной машины операционной системы Phantom для работы в окружении микроядерной ОС Genode. В интервью отмечается, что основная версия Phantom уже готова к пилотным проектам, а версия на базе Genode будет доведена до готовности к применению в конце года. При этом на сайте проекта пока заявлен только работоспособный концептуальный прототип, стабильность и функциональность которого не доведены до уровня, пригодного к промышленному использованию, а среди ближайших планов упоминается формирование альфа-версии, пригодной для экспериментов сторонними разработчиками.
Код проекта распространяется под лицензией LGPL, но последнее изменение в основном репозитории датировано ноябрём 2019 года. Связанная с проектом публичная активность сосредоточена в репозитории с форком для Genode, который с декабря 2020 года поддерживает Антон Антонов, студент из университета Иннополис.
Операционная система Phantom с начала 2000-x годов развивалась как персональный проект Дмитрия Завалишина, а с 2010 года была переведена под крыло компании Digital Zone, созданной Дмитрием. Система примечательна ориентацией на высокую надёжность и использованием концепции “все есть объект” вместо “все есть файл”, позволяющей обойтись без использования файлов за счёт сохранения состояния памяти и непрерывного цикла работы. Приложения в Phantom не завершаются, а лишь приостанавливаются и возобновляют работу c прерванной точки. Все переменные и структуры данных могут хранится столько времени, сколько необходимо приложению, при этом специально программисту не нужно заботиться о сохранении данных.
Приложения в Phantom компилируются в байткод, который выполняется в стековой виртуальной машине, похожей на виртуальную машину Java. Виртуальная машина обеспечивает персистентность памяти приложений – система периодически сбрасывает снимки состояния виртуальной машины на постоянный носитель. После выключения или аварийного завершения работа может быть продолжена, начиная с последнего сохранённого снимка памяти. Снимки создаются в асинхронном режиме и без приостановки работы виртуальной машины, но в снапшоте фиксируется единовременный срез, как будто виртуальную машину остановили, сохранили на диск и опять запустили.
Все приложения выполняются в общем глобальном адресном пространстве, которое позволяет обойтись без переключений контекста между ядром и приложениями, а также существенно упрощает и ускоряет взаимодействие между выполняемыми в виртуальной машине приложениями, которые могут обмениваться объектами через передачу ссылок. Разделение доступа осуществляется на уровне объектов, ссылки на которые можно получить только через вызов соответствующих методов (арифметика указателей отсутствует). Любые данные, в том числе числовые значения, обрабатываются как отдельные объекты.
Для приложения работа выглядит непрерывной и не зависит от перезагрузок ОС, аварийных завершений работы и выключений компьютера. Модель программирования для Phantom сравнивается с запуском никогда не останавливающегося сервера приложений для объектного языка программирования. В качестве одного из основных способов разработки приложений рассматривается портирование для Phantom программ на языке Java, чему способствует схожесть виртуальной машины Phantom с JVM. Кроме компилятора байткода для языка Java, проектом планируется создание компиляторов для Python и C#, а также реализация транслятора из промежуточного кода WebAssembly.
Для выполнения операций, требующих высокой производительности, таких как обработка видео и звука, предусмотрена возможность запуска в отдельных потоках бинарных объектов с нативным кодом (для сборки бинарных объектов используется LLVM). Для доступа к низкоуровневым сервисам ядра часть классов VM (“внутренние” классы) реализована на уровне ядра ОС. Для запуска Linux-приложений предусмотрена POSIX-прослойка, выполняющая эмуляцию вызовов, необходимых для работы Unix-процессов (персистентность для приложений в POSIX-прослойке пока не обеспечивается).
Традиционная ОС Phantom помимо виртуальной машины включает собственное ядро с реализацией потоков, менеджера памяти, сборщика мусора, механизмов синхронизации, системы ввода/вывода и драйверов для работы с оборудованием, что заметно усложняет доведение проекта до готовности к широкому применению. Отдельно развиваются компоненты с сетевым стеком, графической подсистемой и интерфейсом пользователя. Примечательно, что графическая подсистема и оконный менеджер работают на уровне ядра.
Для повышения стабильности, переносимости и безопасности проекта предпринята попытка переноса виртуальной машины Phantom для работы c использованием компонентов открытой микроядерной операционной системы Genode, разработку которой курирует немецкая компания Genode Labs.
Для желающих поэкспериментировать с
Phantom на базе Genode подготовлено специальное сборочное окружение на базе Docker.
Использование Genode даст возможность использовать уже проверенные микроядра и драйверы, а также вынести драйверы в пространство пользователя (в текущем виде драйверы написаны на Си и выполняются на уровне ядра Phantom). В том числе появится возможность использования микроядра seL4, прошедшего математическую верификацию надёжности, подтверждающую, что реализация полностью соответствует спецификациям, заданным на формальном языке. Рассматривается возможность подготовки подобного доказательства надёжности и для виртуальной машины Phantom, что позволит добиться верификации всего окружения ОС.
В качестве основной области применения порта на базе Genode называется разработка приложений для различных промышленных и встраиваемых устройств. В настоящее время уже подготовлен набор изменений для виртуальной машины и добавлены работающие поверх Genode обвязки для обеспечивающих персистентность компонентов ядра и основных низкоуровневых интерфейсов. Отмечается, что виртуальная машина Phantom уже может работать в 64-разрядном окружении Genode, но ещё предстоит реализовать работу VM в режиме персистентности, переработать подсистему драйверов и адаптировать для Genode компоненты с сетевым стеком и графической подсистемой.