В 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.

Ключевые модули и их назначение:

Ключевые модули и их назначение:

Модуль

Назначение

runtime.rs

KernelRuntime — state machine жизненного цикла, главный execution engine

syscall.rs

Syscall ABI (optima_syscall_v0), структура Kernel

ipc.rs

In-memory queue IPC с типизированными endpoint’ами и owner PID

memory.rs

Регионы памяти, mmap/munmap/protect

scheduler.rs

Планировщик процессов и потоков

capability.rs

Граф capabilities, grant/revoke/transfer

policy.rs

Policy rules, overlays, per-PID overrides

audit.rs

Audit trail, экспорт и верификация событий

console_transport.rs

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 тестами.

Что дальше

Ближайшие технические задачи в порядке приоритета:

  1. Физическое device bring-up — загрузиться на реальном x86_64, пройти on-device smoke тесты, зафиксировать реальные perf-числа.

  2. Linux L2 completion — завершить L2-C и начать расширенные signals (signalfd/eventfd).

  3. Android L2 — маппинг Android Binder IPC на optima_syscall_v0 (в backlog, после L2).

  4. Win32 L3 — самый сложный слой, далёкая перспектива.

  5. 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)


  1. forc3meat
    28.03.2026 07:53


  1. Dhwtj
    28.03.2026 07:53

    Правильная картинка
    Правильная картинка


    1. ANTON62 Автор
      28.03.2026 07:53

      Да, пока про рыбов могу только рассказать))) Лучше дотестирую и выкачу уже нормальный проект


  1. SpiderEkb
    28.03.2026 07:53

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


    1. 143672
      28.03.2026 07:53

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


      1. SpiderEkb
        28.03.2026 07:53

        Ну я на работе пишу под чисто серверную систему, а на десктопах у меня винда и линукс. Огромная разница в том, как реализовано на сервере и как на десктопе.

        Описывать разницу будет слишком долго. Потому что все иначе.

        Если интересно - можно почитать Ф.Солтис "Основы AS/400" Там много как общей, так и технической информации о внутренней организации системы.


    1. ANTON62 Автор
      28.03.2026 07:53

      Windows и Linux пытаются работать и на сервере, и на десктопе практически без изменения ядра — отсюда и компромиссы, и форки.

      В OptimaOS ядро содержит только самый минимум (память, IPC, безопасность, планировщик с настройками). Всё остальное — сеть, файловые системы, GUI — вынесено в userspace и собирается в нужную конфигурацию через runtime-профили. Под сервер подкладывается один набор политик и сервисов, под десктоп — другой, под edge — третий. Ядро при этом одно и то же.

      Получится ли обойти те противоречия, о которых вы говорите, — покажет время. Но архитектурно я заложил возможность настраивать поведение под задачу, а не пытаться сделать «одну систему, которая всем хороша».


      1. SpiderEkb
        28.03.2026 07:53

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

        Второй момент - время переключения контекста заданий. В винде/линуксе это достаточно большие накладные расходы.

        Третий момент - системное логирование, журналирование изменения объектов. На серверной ОС всем этим должна заниматься система (системные журналы, логи заданий...).

        Четвертый момент - поддержка исключений на уровне системы, а не ЯП. Т.е. вы не должны ориентироваться на языковые исключения, а иметь в доступе простой механизм использования системных с возможностью проброса их на любой уровень стека вызовов по необходимости.

        А то, что Вы описываете - тут скорее надо смотреть как реализованы микроядерные ОС. Например, QNX


  1. Mingun
    28.03.2026 07:53

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


    1. ANTON62 Автор
      28.03.2026 07:53

      Согласен, тренд в C++ и Rust — это максимальный перенос в compile-time. Но здесь важно разделить что мы выносим в runtime и почему.

      В OptimaOS в runtime вынесена не логика работы драйверов или ядра — она вся скомпилирована и статически верифицирована. В runtime вынесены решения о конфигурации, которые заранее неизвестны. Эти решения невозможно принять в compile-time, если мы не хотим превратиться во фрагментированный зоопарк форков — ровно ту проблему, которую я пытаюсь решить.


      1. Mingun
        28.03.2026 07:53

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


  1. aliakseika
    28.03.2026 07:53

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


    1. ANTON62 Автор
      28.03.2026 07:53

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


  1. Sacred_anton
    28.03.2026 07:53

    Напомнило


  1. qvvah
    28.03.2026 07:53

    Без совместимости с NTAPI или *nix (то есть теми самыми 30-летними ядрами и всем их техдолгом) вы теряете драйвера, прикладное ПО, программистов и пользователей. Имитировать их сисколлы программно, делать обёртки и прослойки к вашему ядру - это долго и дорого (плюс накладные расходы на все операции), что не есть хорошо.

    Может проще было сразу пилить *nix-like ядро, а не городить Linux ABI/API поверх? Меньше слоёв абстракции - лучше, или нет?


    1. ANTON62 Автор
      28.03.2026 07:53

      Да, было бы проще, но не интереснее и потенциально полезнее. Моя гипотеза в том, что можно построить одно безопасное ядро с минимальным TCB, а совместимость с экосистемой обеспечить через прослойку, которая будет достаточно тонкой, чтобы не убивать производительность, но достаточно полной, чтобы не плодить форки.

      Redox OS, кстати, идёт похожим путём — они тоже реализуют совместимость с Linux. И у них это работает.

      Для совместимости с существующим ПО в архитектуру с самого начала заложен linux-compat — не как надстройка или эмуляция, а как слой, транслирующий Linux syscall’ы в нативный optima_syscall_v0.


      1. qvvah
        28.03.2026 07:53

        построить одно безопасное ядро с минимальным TCB, а совместимость с экосистемой обеспечить через прослойку, которая будет достаточно тонкой, чтобы не убивать производительность, но достаточно полной

        Идейно схоже с Fuchia OS и Zircon?

        слой, транслирующий Linux syscall’ы в нативный optima_syscall_v0

        В этом-то и проблема: надо будет не просто транслировать сисколлы, а имитировать баги, специфическое поведение, поддерживать workaround'ы разработчиков вокруг всего этого. По итогу, вы придёте к подобию линухового ядра, под которым лежит ваше ядро, только в отличие от Linux, у вас будет меньше разработчиков. MS от первой версии WSL не просто так отказалась, хотя вам с вашим ядром проще будет это реализовать.


    1. apevzner
      28.03.2026 07:53

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


  1. AnatolyEmelin
    28.03.2026 07:53

    Просто сил и удачи!


  1. MainEditor0
    28.03.2026 07:53

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


    1. ANTON62 Автор
      28.03.2026 07:53

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


      1. MainEditor0
        28.03.2026 07:53

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


        1. ANTON62 Автор
          28.03.2026 07:53

          Это не я. Поставил плюс, но сравнялось к нулю)


      1. SpiderEkb
        28.03.2026 07:53

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


  1. Mitai
    28.03.2026 07:53

    Fucshia делает не тоже самое?


    1. ANTON62 Автор
      28.03.2026 07:53

      Подход похож, но есть различия


  1. Rik_1378
    28.03.2026 07:53

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