7.8 KiB
7.8 KiB
Архитектура ядра 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()
- Limine requests — статические структуры, сообщающие bootloader'у, что ядру нужны: framebuffer, memory map, HHDM offset, адрес ядра.
- BASE_REVISION проверка — убеждаемся, что Limine совместим.
- HHDM инициализация — сохраняем Higher-Half Direct Map offset.
- Framebuffer/TTY — создаём консоль для вывода на экран.
- Serial port — инициализируем COM1 для отладки.
- Early IDT — загружаем базовые обработчики исключений (0–31).
- BitmapPMM::init() — сканируем карту памяти, строим битовую карту.
- LAPIC::init() — настраиваем Local APIC.
- Создание P4 — аллоцируем фрейм для корневой таблицы страниц.
- Identity map — отображаем всю физическую память в HHDM и (для non-reserved) в идентичное отображение.
- Map kernel — отображаем образ ядра.
- Activate P4 — загружаем новую таблицу страниц в CR3.
- Heap init — резервируем 8 MiB для slab-аллокатора.
- CPU features — проверяем INVPCID.
- VMM init — регистрируем AddressSpace ядра.
- IDT final — перезагружаем IDT с Page Fault и TLB shootdown.
- PM Router init — создаём 65536 каналов.
- STI — разрешаем прерывания.
- Capability тесты — тестируем CNode, mint, revoke.
- PMActor тесты — создаём актор, тестируем Alloc/Free/Carve/OOM.
- Buddy тесты — прямое тестирование аллокатора.
- PMM stress test — alloc/free 64 фреймов.
- 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<T> + глобальный аллокатор
│ ├── 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