Files
Elyz/kernel/docs/overview/architecture.md
2026-07-07 16:40:41 +03:00

7.8 KiB
Raw Blame History

Архитектура ядра 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 — загружаем базовые обработчики исключений (031).
  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<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