feat: docs & ARCH 2.2, 2.3, 2.4
This commit is contained in:
105
kernel/docs/overview/architecture.md
Normal file
105
kernel/docs/overview/architecture.md
Normal file
@@ -0,0 +1,105 @@
|
||||
# Архитектура ядра 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
|
||||
```
|
||||
72
kernel/docs/overview/introduction.md
Normal file
72
kernel/docs/overview/introduction.md
Normal file
@@ -0,0 +1,72 @@
|
||||
# Введение в ядро Elyz (LISA)
|
||||
|
||||
## Концептуальная модель
|
||||
|
||||
Elyz (LISA) — это модульное, capability-ориентированное ядро для x86-64,
|
||||
спроектированное вокруг следующих архитектурных принципов:
|
||||
|
||||
### 1. Capability-ориентированная безопасность
|
||||
|
||||
Вместо традиционной модели «всё или ничего» (ring 0 vs ring 3), Elyz
|
||||
использует систему **capabilities** (дескрипторов прав). Каждый дескриптор
|
||||
представляет собой *неподделываемый токен*, дающий доступ к конкретному
|
||||
объекту ядра (фрейму памяти, CNode, PMActor) с определёнными правами.
|
||||
|
||||
- Capability — это не просто число; это структура с полями `object`, `rights`,
|
||||
`relation`, `token_sig`.
|
||||
- Capability можно *создавать* (mint) с урезанными правами от родительского
|
||||
дескриптора.
|
||||
- Capability можно *отозвать* (revoke), что каскадно уничтожает всех потомков.
|
||||
- Система гарантирует, что access — это всегда наличие capability.
|
||||
|
||||
### 2. Многоуровневое управление памятью
|
||||
|
||||
Управление физической памятью разделено на три уровня:
|
||||
|
||||
| Уровень | Компонент | Ответственность |
|
||||
|---------|-----------|-----------------|
|
||||
| 1 (глобальный) | `BitmapPMM` | Владение всей физической памятью, аллокация/освобождение по 4KiB фреймам. Инициализируется из карты памяти bootloader'а. |
|
||||
| 2 (распределённый) | `PMActor` | Актёр физической памяти — владеет *диапазоном* физической памяти, использует `BuddyAllocator` для аллокации внутри этого диапазона. Каждый PMActor — изолированный аллокатор. |
|
||||
| 3 (виртуальный) | `AddressSpace` (VMM) | Управляет виртуальными адресными пространствами (PML4 + VMA-деревья). Использует PMM для аллокации PT-страниц и lazy demand-paging. |
|
||||
|
||||
Эти уровни связывает **PM Router** — lock-free система каналов для асинхронной
|
||||
пересылки запросов и ответов между исполнителями.
|
||||
|
||||
### 3. Асинхронная модель акторов
|
||||
|
||||
PMActor следует модели CSP (Communicating Sequential Processes):
|
||||
|
||||
- Каждый актор имеет lock-free MPSC-очередь входящих сообщений.
|
||||
- Потоки/процессы отправляют запросы (Alloc/Free/Carve) в очередь актора.
|
||||
- Когда актор получает CPU time, он вызывает `process_messages()` и
|
||||
отправляет ответы через PM Router.
|
||||
- PM Router использует 65536 предварительно выделенных каналов для
|
||||
lock-free маршрутизации результатов.
|
||||
|
||||
### 4. Виртуальная память с Copy-on-Write
|
||||
|
||||
`AddressSpace` поддерживает:
|
||||
- **Lazy demand-paging**: физическая страница выделяется только при
|
||||
page fault'е.
|
||||
- **Copy-on-Write (COW)**: при fork'е адресного пространства страницы
|
||||
разделяются между родителем и потомком; копирование происходит
|
||||
при первой записи.
|
||||
- **Zero-copy shared mappings**: физические страницы, принадлежащие
|
||||
capability, могут быть отображены в другое адресное пространство
|
||||
без копирования. Владелец страниц — capability, а не VMA.
|
||||
|
||||
### 5. Отзыв (Revocation) через lock-free очередь
|
||||
|
||||
Система отзыва дескрипторов использует глобальную lock-free кольцевую
|
||||
очередь `MMU_REVOCATION_QUEUE`. При отзыве capability:
|
||||
1. Токен capability помещается в очередь.
|
||||
2. При следующем page fault'е VMM обрабатывает накопленные отзывы.
|
||||
3. Все VMA, связанные с отозванным токеном, аннулируются.
|
||||
|
||||
### 6. Минималистичный дизайн
|
||||
|
||||
- `#![no_std]` — никакой стандартной библиотеки.
|
||||
- `#![no_main]` — точка входа `kmain`.
|
||||
- Все структуры данных, аллокаторы и драйверы написаны с нуля.
|
||||
- Единственные внешние зависимости: `limine` (bootloader протокол),
|
||||
`embedded-graphics` (шрифты), `bitflags`.
|
||||
Reference in New Issue
Block a user