73 lines
5.1 KiB
Markdown
73 lines
5.1 KiB
Markdown
# Введение в ядро 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`.
|