Безопасная x86-64 операционная система на Rust (no_std) с мандатной моделью прав доступа, изоляцией процессов по compartment-ам и совместимостью с Linux ABI.
Автор идеи: Kirill Repin
Большинство ОС проверяют права при входе в систему, но дальше процесс получает привилегии «навсегда». Tomorrow строится на другом принципе: каждое действие проверяется индивидуально.
Права хранятся в ядре и привязаны одновременно к двум сторонам:
- субъект — пользователь или процесс, который что-то запрашивает
- объект — файл, устройство или ресурс, к которому обращаются
Только если права субъекта и допустимые права объекта пересекаются — действие разрешается. Это похоже на мандатный контроль доступа (MAC), но реализованный на уровне ядра с явными масками для каждой сущности.
Процессы объединяются в команды (compartments) — изолированные группы, которые не видят и не могут напрямую влиять друг на друга. Взаимодействие с остальной системой — только через брокеров: специальные процессы-посредники, которые явно определены в ядре и проверяют каждый запрос.
┌─────────────────┐ ┌─────────────────┐
│ Compartment A │ │ Compartment B │
│ proc1 proc2 │ │ proc3 proc4 │
└────────┬────────┘ └─────────┬───────┘
│ только через брокера │
└──────────┬─────────────┘
┌────▼─────┐
│ Broker │ ← проверяет права,
│ │ передаёт только
└──────────┘ разрешённые данные
Номера системных вызовов совпадают с Linux x86-64. Цель — запускать существующие Linux-бинарники без перекомпиляции, при этом применяя собственную модель безопасности на уровне ядра.
| Компонент | Статус |
|---|---|
| Multiboot2 boot (GRUB2) | готово |
Higher-half kernel (0xFFFF800000000000) |
готово |
| PMM — bitmap физических страниц (до 8 GB) | готово |
| VMM — 4-уровневые таблицы страниц (4 KB) | готово |
| Heap — bump-allocator (64 KB) | готово |
| IDT + APIC (Local + IO APIC via ACPI MADT) | готово |
| TSS + GDT (kernel/user сегменты) | готово |
| Round-robin планировщик (до 64 процессов) | готово |
| Контекст-свитч через прерывание таймера | готово |
| Userspace ring-3 (iretq) | готово |
| SYSCALL/SYSRET (MSR-based) | готово |
| PS/2 клавиатура | готово |
| Framebuffer-консоль + PSF-шрифт | готово |
| PCI/PCIe enumeration (MCFG) | готово |
| xHCI USB | обнаружение работает, init отключён |
| № | Название | Описание |
|---|---|---|
| 0 | SYS_READ |
fd, buf, len |
| 1 | SYS_WRITE |
fd, buf, len |
| 2 | SYS_OPEN |
— |
| 3 | SYS_CLOSE |
— |
| 24 | SYS_YIELD |
— |
| 60 | SYS_EXIT |
code |
- Linux (Ubuntu/Debian, Arch, Fedora)
- Rust nightly
grub-mkrescue,xorriso,gcc,nasmqemu-system-x86_64— для запуска в эмуляторе
Автоматическая установка:
./setup.sh./make.shСобирает ELF-ядро через cargo и упаковывает его в загрузочный ISO-образ tomorrow.iso.
qemu-system-x86_64 \
-cdrom tomorrow.iso \
-m 256M \
-serial stdio./load.shСкрипт покажет список дисков и запишет tomorrow.iso через dd.
src/
boot.s — старт 32→64 бит, page tables, higher half
main.rs — kernel_main, парсинг Multiboot2/ACPI, scheduler
pmm.rs — физический менеджер памяти
vmm.rs — виртуальный менеджер памяти
heap.rs — bump-allocator
idt.rs — дескрипторная таблица прерываний
lapic.rs — Local APIC
ioapic.rs — IO APIC
pic.rs — отключение PIC 8259
hpet.rs — HPET таймер
tss.rs — TSS + GDT
process.rs — структура процесса и контекста
scheduler.rs — round-robin планировщик
syscall.rs — обработчик системных вызовов
syscall_entry.s — вход/выход SYSCALL (MSR)
timer.s — обработчик прерывания таймера, context switch
switch.s — start_first_process_ring3
keyboard.rs — PS/2 клавиатура
keyboard.s — ISR клавиатуры
console.rs — framebuffer-консоль
font.rs / font.psf — PSF-шрифт
pci.rs — поиск xHCI через MCFG/PCIe
xhci.rs — xHCI USB (WIP)
boot/grub/grub.cfg — конфиг загрузчика
md/architecture.md — подробная документация архитектуры
Подробное описание всех подсистем — в md/architecture.md.
Раскладка виртуальной памяти:
0xFFFF_FFFF_FFFF_FFFF ┐
│ kernel space
0xFFFF_8000_0000_0000 ─┤ ядро, стеки, heap
... │ non-canonical hole
0x0000_0200_0000_0000 ─┤ user code
0x0000_0100_0000_0000 ─┤ user stack
0x0000_0000_0000_0000 ┘