Микроядро на основе capability для x86-64
Anvil — микроядро с фокусом на безопасность, написанное на Rust с userspace на C. Проект объединяет строгую capability-модель seL4 с практичным API-дизайном Zircon, создавая систему, в которой каждый доступ к ресурсу явно авторизован, каждый процесс изолирован, и каждая привилегия контролируется.
Большинство операционных систем доверяют слишком большому объёму кода. Один баг в драйвере монолитного ядра может уронить всю систему. Anvil идёт другим путём: ядро делает минимум — планирование потоков, управление памятью, IPC — а всё остальное работает как изолированные userspace-сервисы, общающиеся через передачу сообщений.
Идея не нова. seL4 доказал, что это возможно с гарантиями математической корректности. Zircon показал, что это может быть достаточно практичным для потребительских устройств. Anvil ищет золотую середину: capability-based система, которая безопасна по дизайну и при этом доступна для системных программистов.
Ядро предоставляет четыре основные подсистемы:
Потоки — создание TCB (Thread Control Block), конфигурация, настройка регистров, планирование. SMP с per-CPU очередями и work stealing.
Память — VMO (Virtual Memory Object) как единица физической памяти. VMA-маппинг в адресные пространства. Процессы не могут обращаться к памяти, к которой им явно не предоставлен доступ.
Capability — каждый ядерный объект (поток, адресное пространство, объект памяти, endpoint) доступен через capability, хранящиеся в CNode процесса. Capability несут права (read, write, manage), которые можно только уменьшать, но никогда увеличивать. Передача capability между процессами через cap_copy.
IPC — синхронная rendezvous-модель передачи сообщений через Endpoint. Вместе с данными можно передавать capability, обеспечивая безопасное делегирование полномочий между сервисами.
Anvil находится на ранней стадии активной разработки. Что работает сейчас:
- Ядро загружается на x86-64 (QEMU), многоядерный SMP-планировщик работает
- Init-процесс загружает сервисы из CPIO-архива, создаёт TCB/VSpace/CNode
- Передача capability от init к дочерним процессам (
cap_copy) - Дочерние процессы взаимодействуют со своим VSpace (маппинг/анмаппинг памяти)
- Интерфейс системных вызовов:
tcb_create,tcb_configure,tcb_set_regs,tcb_resume,vmo_create,vma_map,vma_unmap,vma_alloc,cap_copy
Следующие шаги: реализация IPC, name server, bootstrap libc, IO server.
| Компонент | Технология |
|---|---|
| Ядро | Rust (nightly, x86_64-unknown-none) |
| Userspace | C (freestanding, -nostdlib) |
| Сборка | Cargo (ядро) + CMake (userspace) |
| Платформа | x86-64, QEMU |
| Загрузка | CPIO-based initramfs |
# Сборка ядра
cargo build --target x86_64-unknown-none
# Сборка userspace-сервисов
mkdir build && cd build
cmake .. && make -j$(nproc)
# Запуск в QEMU
./run.shПодробные инструкции — в руководстве разработчика.
Anvil ищет системных программистов, знакомых с C, виртуальной памятью и работой без стандартной библиотеки. Текущие приоритеты:
- Bootstrap libc — минимальный C runtime для userspace-сервисов (malloc, строковые функции, printf)
- IPC — синхронная передача сообщений через ядерные endpoint'ы
- Name server — реестр сервисов для обнаружения процессов друг другом
- IO server — централизованное управление вводом-выводом, замена debug-syscall'ов
Подробности об архитектуре и онбординг — в руководстве разработчика.
[TBD]