В 2026 году написать операционную систему с нуля — это либо академическое упражнение, либо попытка решить реальную проблему. OptimaOS — второе: проект исследует, можно ли построить одно ядро, которое без форкинга и переписывания обслуживало бы десктоп, сервер, Edge и AI-устройство одновременно. В этой статье — мотивация, архитектурные решения и статус проекта.

Почему в 2026 году кто-то пишет новую ОС
Ядра, на которых работает большинство современного железа, — Linux (1991), Windows NT (1993), Darwin (2001) — написаны в эпоху, когда о memory safety никто особо не думал, а слова «edge computing» и «AI accelerator» звучали как научная фантастика. Эти системы решают свои задачи хорошо — но несут 30+ лет технического долга и архитектурных решений, принятых в совершенно других условиях.
Конкретная проблема, которая меня беспокоила: фрагментация через форкинг.
Android — это форк Linux с тысячами кастомных патчей, которые upstream годами не принимает
Embedded Linux — ещё один набор форков под конкретные SoC-и от каждого вендора
RTOS для IoT/Edge — как правило, отдельные кодовые базы с несовместимыми API
AI-ускорители живут под своими специализированными стеками с минимальной совместимостью
Итог: вместо одной хорошо проверенной, аудированной кодовой базы — зоопарк форков с разным уровнем безопасности, разными системными вызовами и разным поведением в граничных случаях. Каждый форк — это отдельный security-аудит, отдельная команда, отдельный регресс.
Гипотеза OptimaOS: можно построить одно ядро, которое через механизм runtime-профилей обслуживает принципиально разные сценарии — без форкинга исходного кода.
Механизм vs политика: ключевое архитектурное решение
В операционных системах есть классический принцип, сформулированный ещё в работах UNIX: ядро должно предоставлять механизмы, но не диктовать политику. На практике большинство ядер этот принцип нарушают — туда просачиваются решения, которые правильнее было бы оставить userspace’у.
В OptimaOS это разграничение проведено жёстко и зафиксировано в архитектурном решении ADR-0002:
Что живёт в ядре (механизмы, неизменны для всех конфигураций):
Управление памятью (регионы, mmap/munmap/protect)
Планировщик процессов и потоков
IPC-шина с типизированными endpoint’ами
Capability-граф (права доступа к ресурсам)
Syscall ABI (
optima_syscall_v0)
Что живёт в профилях (политика, меняется runtime):
Правила политик (какой процесс что может делать)
Конфигурация userspace-сервисов (запускать ли сетевой стек, с какими параметрами)
Параметры планировщика (latency vs throughput)
Разрешённые syscall-паттерны
Практически это выглядит так: бинарный образ ядра один и тот же для десктопного home-профиля и серверного server-профиля. При старте загружается соответствующий policy-файл, и policy-service применяет его поверх ядра через runtime API. Никакой пересборки ядра, никакого форкинга.

Это не новая идея — похожий подход используется в seL4 и некоторых RTOS. Но в сочетании с Rust и современным toolchain’ом результат получается интересным.
Почему Rust
Выбор Rust для системного программирования в 2026 году уже не требует долгих обоснований — Microsoft, Google, Linux kernel, Android открыто говорят о переходе. Но для нас конкретные причины были следующими:
1. Memory safety без GC. Ядро не может позволить себе garbage collector. Rust даёт compile-time гарантии отсутствия dangling pointers, use-after-free, buffer overflow — без рантайм-оверхеда. Это не просто удобство, это требование к TCB (Trusted Computing Base).
2. #[forbid(unsafe_code)] как политика. В kernel-core это не рекомендация, а запрет на уровне компилятора. Весь unsafe-код изолирован в HAL-слое (hardware/mod.rs) и явно аннотирован. Количество unsafe-строк можно посчитать за минуту.
3. Ownership model отлично ложится на capability-модель. Capabilities в OptimaOS — это токены владения ресурсами. Rust ownership и lifetime semantics естественно выражают те же инварианты на уровне типов.
4. Toolchain и экосистема. cargo test, cargo build --target x86_64-unknown-uefi, встроенная поддержка no_std — инфраструктура для написания ОС из коробки намного лучше, чем была в C 30 лет назад.
Архитектура OptimaOS
Проект организован как Rust workspace с несколькими crate’ами:
kernel-core/ — единственный execution engine, всё ядро здесь linux-compat/ — Linux ABI bridge (L1/L2 staged) policy-service/ — userspace policy manager device-manager/ — userspace device manager filesystem-service/ — userspace filesystem service network-service/ — userspace network service profile-service/ — userspace profile overlay service
Важный момент: policy-service, device-manager и остальные сервисы не зависят от kernel-core как от библиотеки. Они общаются с ядром через typed IPC + capabilities — ровно так, как должно быть в микроядерной архитектуре. Только linux-compat явно зависит от kernel-core, потому что реализует маппинг Linux syscall’ов на optima_syscall_v0.
Ключевые модули и их назначение:
Ключевые модули и их назначение:
Модуль |
Назначение |
|---|---|
|
|
Syscall ABI ( |
|
In-memory queue IPC с типизированными endpoint’ами и owner PID |
|
Регионы памяти, mmap/munmap/protect |
|
Планировщик процессов и потоков |
|
Граф capabilities, grant/revoke/transfer |
|
Policy rules, overlays, per-PID overrides |
|
Audit trail, экспорт и верификация событий |
|
|
Transport v1 (UEFI shim ↔ runtime)Console Transport: двухслойная архитектура |
Console Transport: двухслойная архитектура
Это одно из нетривиальных решений, зафиксированных в ADR-0003. UEFI shim и kernel runtime разделены явным транспортным протоколом:
Stage A (UEFI shim): transport + diagnostics только. Пересылает input-события в runtime, рендерит output. Не исполняет команды.
Stage B (kernel-core runtime): единственная точка исполнения команд. Все
sys.*команды обрабатываются здесь.
Жизненный цикл: BootInit → ShimReady → RuntimeAttach → Interactive → Degraded
Смысл такого разделения: UEFI-код работает в привилегированном режиме с доступом к boot services. Если дать ему возможность исполнять команды напрямую, boundary между boot и runtime размывается, и аудировать систему становится сложнее. Строгое разделение позволяет верифицировать каждый слой независимо.
Linux ABI совместимость: зачем и как
Самописная ОС без совместимости с существующим ПО — это интересный эксперимент, но не более. Поэтому linux-compat реализует маппинг Linux syscall’ов на optima_syscall_v0 в несколько этапов:
L1 (реализовано): clone, exit, nanosleep, mmap, munmap, sendmsg, recvmsg, минимальные сигналы, минимальный epoll.
L2-A (реализовано): fd lifecycle (open/close/read/write), dup/dup2, poll/epoll_wait.
L2-B (реализовано): signal masks, pending queue.
L2-C (реализовано): epoll_ctl(DEL/MOD), расширенная epoll-семантика.
Важная оговорка: Linux bridge API помечен как draft — это не стабильный публичный ABI, совместимость не гарантируется между версиями до явного объявления стабильности.
Почему поэтапно, а не всё сразу? Потому что каждый новый syscall — это расширение attack surface. Сначала верифицируем L1, потом L2. Каждый этап закрывается compatibility matrix тестами.
Что дальше
Ближайшие технические задачи в порядке приоритета:
Физическое device bring-up — загрузиться на реальном x86_64, пройти on-device smoke тесты, зафиксировать реальные perf-числа.
Linux L2 completion — завершить L2-C и начать расширенные signals (
signalfd/eventfd).Android L2 — маппинг Android Binder IPC на
optima_syscall_v0(в backlog, после L2).Win32 L3 — самый сложный слой, далёкая перспектива.
Unicode + image rendering в GUI framework.
Глобальная цель — проверить гипотезу: один kernel binary, работающий с разными профилями на десктопе, сервере и Edge-устройстве. Если это реализуемо без деградации производительности — интересно идти дальше.
Заключение
OptimaOS — это рабочий прототип, а не продукт. Но за этим прототипом стоит конкретная архитектурная гипотеза о разделении механизмов и политик, о runtime-конфигурируемости вместо форкинга, о Rust как фундаменте для ядра с верифицируемой memory safety.
Результаты пока обнадёживают: ядро компилируется и тестируется детерминированно, Linux ABI совместимость реализуется поэтапно без нарушения syscall контракта, xHCI драйвер работает под QEMU. Следующий серьёзный рубеж — реальное железо.
Если вам интересна тема проектирования ядер, Rust systems programming или Linux ABI совместимость — буду рад обсудить конкретные технические решения в комментариях. Особенно интересны взгляды тех, кто работал с seL4, Zephyr или L4-микроядрами — есть что сравнить.
Проект находится в активной разработке. Исходный код пока не опубликован — планирую сделать это после достижения вменяемой работоспособности.
Комментарии (27)

SpiderEkb
28.03.2026 07:53По-моему, делать ОС, которая и для сервера и для десктопа так себе идея. Слишком разные требования.

143672
28.03.2026 07:53Семейство убунты разве не этим же занимается? У меня и на десктопе, и на сервере и gh раннеры

SpiderEkb
28.03.2026 07:53Ну я на работе пишу под чисто серверную систему, а на десктопах у меня винда и линукс. Огромная разница в том, как реализовано на сервере и как на десктопе.
Описывать разницу будет слишком долго. Потому что все иначе.
Если интересно - можно почитать Ф.Солтис "Основы AS/400" Там много как общей, так и технической информации о внутренней организации системы.

ANTON62 Автор
28.03.2026 07:53Windows и Linux пытаются работать и на сервере, и на десктопе практически без изменения ядра — отсюда и компромиссы, и форки.
В OptimaOS ядро содержит только самый минимум (память, IPC, безопасность, планировщик с настройками). Всё остальное — сеть, файловые системы, GUI — вынесено в userspace и собирается в нужную конфигурацию через runtime-профили. Под сервер подкладывается один набор политик и сервисов, под десктоп — другой, под edge — третий. Ядро при этом одно и то же.
Получится ли обойти те противоречия, о которых вы говорите, — покажет время. Но архитектурно я заложил возможность настраивать поведение под задачу, а не пытаться сделать «одну систему, которая всем хороша».

SpiderEkb
28.03.2026 07:53Десктопные и серверные системы, все-таки, отличаются не только наличием GUI. У серверных систем совершенно другие требования по нагрузке - они работают у условиях огромного количества одновременно выполняющихся заданий и тут сразу встают вопросы изолированности заданий друг от друга так, чтобы даже самая кривая программа в одном задании не могла оказать влияние на все остальные. Не скажу за линукс, но винду я легко могу загнать в дикие лаги одной программой. Всю винду. Так, что даже завершить процесс будет сложно.
Второй момент - время переключения контекста заданий. В винде/линуксе это достаточно большие накладные расходы.
Третий момент - системное логирование, журналирование изменения объектов. На серверной ОС всем этим должна заниматься система (системные журналы, логи заданий...).
Четвертый момент - поддержка исключений на уровне системы, а не ЯП. Т.е. вы не должны ориентироваться на языковые исключения, а иметь в доступе простой механизм использования системных с возможностью проброса их на любой уровень стека вызовов по необходимости.
А то, что Вы описываете - тут скорее надо смотреть как реализованы микроядерные ОС. Например, QNX

Mingun
28.03.2026 07:53Странное желание… В то время, как Rust и C++ работают над тем, чтобы как можно больше можно было перенести в compile-time вы разворачиваетесь в обратном направлении и для специализированных систем предлагаете решать, что им нужно в runtime… Зачем? Чтобы энтузиасты смогли запустить Doom на еще одном устройстве?

ANTON62 Автор
28.03.2026 07:53Согласен, тренд в C++ и Rust — это максимальный перенос в compile-time. Но здесь важно разделить что мы выносим в runtime и почему.
В OptimaOS в runtime вынесена не логика работы драйверов или ядра — она вся скомпилирована и статически верифицирована. В runtime вынесены решения о конфигурации, которые заранее неизвестны. Эти решения невозможно принять в compile-time, если мы не хотим превратиться во фрагментированный зоопарк форков — ровно ту проблему, которую я пытаюсь решить.

Mingun
28.03.2026 07:53Зоопарк форков потому и появляется, что форк – это просто compile-time решение для конфигурации конкретного устройства. Все равно, что feature-флаг в Rust или дефайн в С++ – только живет не в общей базе кода, а у конкретного производителя (в общей зачем ему быть, если железо, для которого он нужен, есть только у конкретной компании?). Зачем там грузить что-то в runtime, если это всегда будет одно и то же?

aliakseika
28.03.2026 07:53А Redox OS не закрывает необходимый функционал? Я жду выхода финальной версии, мне кажется очень иниересный и перспективный проект

ANTON62 Автор
28.03.2026 07:53Да, практически у нас проект близко к Redox, но он планирует отдельные издания системы (Redox Server, Redox Desktop), а у нас одно ядро и поверх политики (которые можно менять "на лету"). А так да проект очень интересный

qvvah
28.03.2026 07:53Без совместимости с NTAPI или *nix (то есть теми самыми 30-летними ядрами и всем их техдолгом) вы теряете драйвера, прикладное ПО, программистов и пользователей. Имитировать их сисколлы программно, делать обёртки и прослойки к вашему ядру - это долго и дорого (плюс накладные расходы на все операции), что не есть хорошо.
Может проще было сразу пилить *nix-like ядро, а не городить Linux ABI/API поверх? Меньше слоёв абстракции - лучше, или нет?

ANTON62 Автор
28.03.2026 07:53Да, было бы проще, но не интереснее и потенциально полезнее. Моя гипотеза в том, что можно построить одно безопасное ядро с минимальным TCB, а совместимость с экосистемой обеспечить через прослойку, которая будет достаточно тонкой, чтобы не убивать производительность, но достаточно полной, чтобы не плодить форки.
Redox OS, кстати, идёт похожим путём — они тоже реализуют совместимость с Linux. И у них это работает.
Для совместимости с существующим ПО в архитектуру с самого начала заложен linux-compat — не как надстройка или эмуляция, а как слой, транслирующий Linux syscall’ы в нативный optima_syscall_v0.

qvvah
28.03.2026 07:53построить одно безопасное ядро с минимальным TCB, а совместимость с экосистемой обеспечить через прослойку, которая будет достаточно тонкой, чтобы не убивать производительность, но достаточно полной
Идейно схоже с Fuchia OS и Zircon?
слой, транслирующий Linux syscall’ы в нативный optima_syscall_v0
В этом-то и проблема: надо будет не просто транслировать сисколлы, а имитировать баги, специфическое поведение, поддерживать workaround'ы разработчиков вокруг всего этого. По итогу, вы придёте к подобию линухового ядра, под которым лежит ваше ядро, только в отличие от Linux, у вас будет меньше разработчиков. MS от первой версии WSL не просто так отказалась, хотя вам с вашим ядром проще будет это реализовать.

apevzner
28.03.2026 07:53Настоящий линукс тоже, как не удивительно, реализует Linux ABI/API поверх внутренней инфраструктуры ядра, Которая не тождественна публичному API…

MainEditor0
28.03.2026 07:53То есть это будет микроядро полностью (memory-safe + unsafe) на Rust и с бинарной совместимостью с Linux и в т. ч. с линуксовыми драйверами? А какая лицензия планируется для кода в репозитории после публикации?

ANTON62 Автор
28.03.2026 07:53Бинарная совместимость с Linux не с ядром, а с пользовательским пространством Linux. Т.е. это userspace ABI, а не драйверная модель Linux. По лицензии — пока склоняюсь к MIT + Apache 2.0, окончательного решения не принял.

MainEditor0
28.03.2026 07:53Понял, спасибо за подробности и удачи в развитии проекта, как и многие, я закинул статью в закладки. А downvote за что? :(

SpiderEkb
28.03.2026 07:53Честно говоря, не уверен что стоит стремится к такой совместимостью именно с Линуксом. По моему скромному мнению, достаточно POSIX совместимости.

Rik_1378
28.03.2026 07:53я конечно вообще не спец в этом направлении. Но недавно поразмышляв о современных ОС, лично я пришел к выводу, что системы слишком архаичны, и несут за собой большой груз технического долга и множество попыток адаптации всего и вся. Что в свою очередь сталкивается с современными тенденциями и будущего данного направления.
Желаю успехов в данном проекте, надеюсь всё получится, на крайний случай, как минимум будет протестированная теория, которая либо окажется успешной, либо нет, либо вообще даст новое видение на всё это. Я пока больше теоретик только, и то начинающий, очень интересно будущее данного проекта. И в целом мне близки ваши мысли судя по вашим другим постам и идеям, относительно того же мессенджера


forc3meat