106 lines
7.8 KiB
Markdown
106 lines
7.8 KiB
Markdown
# Архитектура ядра 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<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
|
||
```
|