nos_
ENRU

x86-64 · arm64 · C++20 · Rust

Ядро ОС, безопасное по построению

nos — ядро операционной системы для x86-64 и arm64 на C++20, Rust и ассемблере. Оно загружается в QEMU, в облаках на KVM, на Apple Silicon и на выделенных серверах — и вырастает в облачный узел, который запускает гостевые Linux под собственным гипервизором на Rust.

$ ./scripts/qemu-arm64.sh
…
rust_test: passed
SoftIrq: initialized
part: 0 partitions on 1 disks
MountRootFs: mounted ramfs on / (rw)
nanofs: bad magic 0x0
MountRootFs: mounted procfs on /proc (ro)
tcp: initialized, up to 64 connections
udpshell: started on port 9000
boot: complete

  _   _  ___  ____
 | \ | |/ _ \/ ___|
 |  \| | | | \___ \
 | |\  | |_| |___) |
 |_| \_|\___/|____/

DHCP auto on eth0...
DHCP ip: 10.0.2.15
DNS resolver started, server: 10.0.2.3
$ █
Конец настоящего лога загрузки arm64 в QEMU.

Зачем ещё одно ядро

Linux написан на C — прекрасном языке, который оставляет программисту каждую проверку границ, каждое время жизни объекта и каждую блокировку, и так на десятках миллионов строк. Уязвимости в нём больше не приходят поодиночке.

7 856

CVE ядра Linux опубликовано в 2026 году к 22 октября — больше, чем за весь 2025-й (5 675)

3 754

из них — только за август и сентябрь; за весь первый квартал было 644

8

уязвимостей ядра Linux CISA добавило в 2026 году в каталог эксплуатируемых в реальных атаках

Искусственный интеллект сделал поиск ошибок дешёвым. В мае Линус Торвальдс написал, что непрекращающийся поток отчётов от ИИ сделал список рассылки по безопасности почти неуправляемым. В августе исправление, где ИИ-система указана соавтором, закрыло Vghost (CVE-2026-74580): устаревший кэш в vhost давал локальному пользователю root, а за виртуальным IOMMU позволял гостю писать за границы в процесс QEMU на хосте — сквозь тот самый слой, который гипервизор и должен держать закрытым.

Наш подход

≈ 90 000 строк

Минимальное — значит проверяемое

Около 90 000 строк кода на всё ядро с драйверами, сетевым стеком и файловыми системами и на гипервизор — не десятки миллионов. Его можно прочитать целиком, и его куда проще верифицировать.

63% Rust · 1,7% из них unsafe

Безопасный Rust по умолчанию

63% кода — на Rust, и лишь 1,7% его строк лежат внутри unsafe-блоков: они сосредоточены в крейтах, которые касаются железа и C ABI, и пересчитываются при каждом изменении. Запись за границы, use-after-free и гонки данных в остальном коде просто не написать: в логике гипервизора — 4 места с unsafe на 18 929 строк.

4 фаззера на хосте, в CI

Фаззинг — гражданин первого класса

Четыре фаззера собирают для хоста исходники самого ядра — устройства и цикл исполнения гипервизора, сетевой стек, файловые системы, C++ под ASan и UBSan — и гоняются в CI на каждое изменение, а между изменениями идут долгие кампании.

UBSan · RUSTUB · W^X

Каждое изменение под проверкой

Сборки с UBSan и проверками unsafe загружаются в CI на обеих архитектурах, у каждой подсистемы свой гейт, а нарушенный инвариант — это паника с указанием места, а не тихое зависание.

Linux никуда не уходит — он становится гостем. Меняется хост под ним, единственный слой, который не имеет права упасть: достаточно маленький, чтобы его проверить, и устроенный так, что целые классы его ошибок невозможно написать.

Источники: NVD: CVE от CNA kernel.org, например за сентябрь 2026 · linux-cve-announce · каталог CISA KEV · Линус Торвальдс, 17 мая 2026 · исправление Vghost (Assisted-by: tencentos-corvus-ai) · Tencent Zhuque Lab о Vghost · nos: scripts/sloc.py, scripts/unsafe-count.py

Что внутри

Ни неопределённого поведения, ни порчи памяти, ни гонок, ни взаимоблокировок, ни тихих отказов: каждое решение здесь выбирается прежде всего ради этого.

Две архитектурыx86-64 с Multiboot2 под BIOS и UEFI и arm64 на QEMU virt — одно ядро за слоем HAL, обе архитектуры загружаются в CI на каждое изменение.Rust поверх фундамента на C++Загрузка, страничная память, аллокаторы, планировщик и прерывания — на C++20. Блочный слой, сетевой стек, файловые системы, virtio и все драйверы — на Rust, а unsafe собран в kcore.Собственный гипервизорБэкенды AMD-V и Intel VT-x в выгружаемом модуле. Немодифицированные Linux, Alpine и Debian загружаются гостями — с несколькими CPU, дисками virtio и коммутатором с NAT.СетьARP, IPv4, DHCP, DNS, UDP и TCP, HTTP-клиент с TLS 1.3 через rustls и SSH-сервер со входом по ключу Ed25519.ХранилищеАсинхронный блочный слой с драйверами NVMe и virtio, MBR и GPT, ext2 на чтение и запись, nanofs с контрольными суммами и VFS поверх всего этого.Загружаемые модулиСервисы ядра на Rust в виде .ko: связываются с таблицей экспорта, сгенерированной из FFI-деклараций, загружаются через insmod и никогда не бывают записываемыми и исполняемыми одновременно.Гейты вместо надеждСборки с UBSan и проверками unsafe загружаются в CI, у каждой подсистемы свой гейт, а четыре фаззера на хосте собраны из исходников самого ядра.Отказы, которые слышноСимволизированные бэктрейсы, сторожевой таймер блокировок, TLB shootdown, который называет не ответившие CPU, профилировщик на PMU и netconsole для машин без последовательного порта.

Где работает

Разрабатывается в эмуляторах и облаках, проверяется на реальных машинах — у двух из них нет никакой консоли, кроме сети.

Виртуальные

  • QEMU / KVMx86-64, BIOS и UEFI
  • Apple SiliconQEMU virt с HVF
  • Google CloudKVM, virtio
  • Yandex CloudKVM, virtio

Реальное железо

  • Dell Latitude 5480UEFI, консоль на фреймбуфере, USB-клавиатура
  • Hetzner EX44Intel, RTL8125, гости на VT-x; консоль — только сеть
  • Hetzner AX41AMD Ryzen, Intel I210, гости на AMD-V

Дорожная карта

От ядра, которое загружается на серверах, к облачному узлу на голом железе: без Linux на хосте, с гостевыми Linux под гипервизором на Rust и с живым обновлением под ними.

  1. 00Готово

    Голое железо

    nos загружается на реальных серверах и остаётся управляемым.

  2. 01Постоянно

    Стратегия Rust

    Новый код — на Rust, unsafe заперт в нескольких маленьких крейтах.

  3. 02Готово

    HAL + arm64

    Слой переносимости и arm64 под QEMU и HVF — раньше гипервизора.

  4. 03В работе

    Гипервизор

    Гипервизор на Rust на AMD-V и VT-x загружает гостевые Linux.

  5. 04В планах

    Плоскость управления

    HTTP API создаёт и удаляет виртуальные машины и открывает их консоли.

  6. 05В планах

    Живое обновление

    Ядро хоста заменяется под работающими гостями быстрее чем за 100 мс.

Из блога

Все статьи
13 мин чтения

Сеть гостей: с 5,7 секунды до 2,8 — и две идеи, которые не выдержали замеров

Posted interrupts, one-shot-таймер, модерация прерываний приёма, offload, отображённые кольца — с замерами на железе; halt polling и задача для NIC не помогли.

ГипервизорСетьПроизводительностьx86-64Rust
9 мин чтения

Как гипервизор nos не пускает спекулятивное исполнение гостя к хосту и соседям

Очистка регистров, заполнение RSB, IBPB, IBRS, BHI_DIS_S, VERW: что гипервизор nos делает вокруг каждого VM exit, сколько это стоит и что ещё открыто.

ГипервизорБезопасностьx86-64ПроизводительностьЖелезо

Что дальше