# Архитектура ядра Elyz ## Высокоуровневая схема ``` ┌─────────────────────────────────────────────────────────────────────┐ │ kmain() — точка входа │ │ (инициализация: Limine, PMM, LAPIC, IDT, VMM, PM Router, Caps) │ └──────────────┬──────────────────────────────────────┬───────────────┘ │ │ ┌──────────▼──────────┐ ┌─────────▼──────────────┐ │ memory subsystem │ │ capability system │ │ │ │ │ │ ┌───────────────┐ │ │ ┌──────────────────┐ │ │ │ BitmapPMM │ │ │ │ CapDescriptor │ │ │ │ (глобальный) │ │ │ │ (права + объект) │ │ │ └───────┬───────┘ │ │ └────────┬─────────┘ │ │ │ │ │ │ │ │ ┌───────▼───────┐ │ │ ┌────────▼─────────┐ │ │ │ PM Actor + │ │ │ │ CNode │ │ │ │ BuddyAlloc │ │ │ │ (таблица caps) │ │ │ └───────┬───────┘ │ │ └──────────────────┘ │ │ │ │ │ │ │ ┌───────▼───────┐ │ └────────────────────────┘ │ │ PM Router │ │ │ │ (каналы) │ │ │ └───────┬───────┘ │ │ │ │ │ ┌───────▼───────┐ │ │ │ AddressSpace │ │ │ │ (VMM, PML4) │ │ │ └───────────────┘ │ └─────────────────────┘ ┌──────────────────────┐ ┌──────────────────────┐ │ cpu subsystem │ │ debug subsystem │ │ ┌────────────────┐ │ │ ┌─────────────────┐ │ │ │ IDT + Interrupt│ │ │ │ Serial port │ │ │ │ Handlers │ │ │ │ (COM1) │ │ │ └────────────────┘ │ │ └─────────────────┘ │ │ ┌────────────────┐ │ │ ┌─────────────────┐ │ │ │ Local APIC │ │ │ │ Log macros │ │ │ └────────────────┘ │ │ │ (info!/warn!) │ │ └──────────────────────┘ │ └─────────────────┘ │ └──────────────────────┘ ``` ## Порядок инициализации в `kmain()` 1. **Limine requests** — статические структуры, сообщающие bootloader'у, что ядру нужны: framebuffer, memory map, HHDM offset, адрес ядра. 2. **BASE_REVISION проверка** — убеждаемся, что Limine совместим. 3. **HHDM инициализация** — сохраняем Higher-Half Direct Map offset. 4. **Framebuffer/TTY** — создаём консоль для вывода на экран. 5. **Serial port** — инициализируем COM1 для отладки. 6. **Early IDT** — загружаем базовые обработчики исключений (0–31). 7. **BitmapPMM::init()** — сканируем карту памяти, строим битовую карту. 8. **LAPIC::init()** — настраиваем Local APIC. 9. **Создание P4** — аллоцируем фрейм для корневой таблицы страниц. 10. **Identity map** — отображаем всю физическую память в HHDM и (для non-reserved) в идентичное отображение. 11. **Map kernel** — отображаем образ ядра. 12. **Activate P4** — загружаем новую таблицу страниц в CR3. 13. **Heap init** — резервируем 8 MiB для slab-аллокатора. 14. **CPU features** — проверяем INVPCID. 15. **VMM init** — регистрируем AddressSpace ядра. 16. **IDT final** — перезагружаем IDT с Page Fault и TLB shootdown. 17. **PM Router init** — создаём 65536 каналов. 18. **STI** — разрешаем прерывания. 19. **Capability тесты** — тестируем CNode, mint, revoke. 20. **PMActor тесты** — создаём актор, тестируем Alloc/Free/Carve/OOM. 21. **Buddy тесты** — прямое тестирование аллокатора. 22. **PMM stress test** — alloc/free 64 фреймов. 23. **HCF** — гасим CPU. ## Модульная структура ``` src/ ├── main.rs — точка входа, инициализация, тесты ├── cap/ — capability система │ ├── mod.rs — CNode (таблица дескрипторов) │ ├── descriptor.rs — типы Capability, CapObject, CapRights, Relation │ └── object.rs — KernelObject (ref-counted) ├── cpu/ — подсистема CPU │ ├── mod.rs — реэкспорт модулей │ ├── idt.rs — IDT entry/table/ptr │ ├── interrupts.rs — обработчики исключений, TLB shootdown │ └── lapic.rs — Local APIC драйвер ├── debug/ — подсистема отладки │ ├── mod.rs — LogLevel, log!/info!/warn! макросы │ └── serial.rs — COM1 serial port драйвер ├── events.rs — RevocationQueue (lock-free кольцевой буфер) ├── tty.rs — Framebuffer console (PSF2 шрифты) ├── mem/ — подсистема памяти │ ├── mod.rs — реэкспорт модулей │ ├── address.rs — PhysAddr, VirtAddr, HHDM offset │ ├── allocator.rs — SlabAllocator + Locked + глобальный аллокатор │ ├── buddy.rs — BuddyAllocator (intrusive list, O(1)) │ ├── paging.rs — PageTable, 4-level page walk │ ├── pmm.rs — BitmapPMM (tree bitmap с L1 ускорением) │ ├── pm_manages.rs — PMActor + PMActorQueue (MPSC) │ ├── pm_router.rs — PMRouter (65536 lock-free каналов) │ └── vmm.rs — AddressSpace, VMA, COW, fork, TLB shootdown ```