57 lines
3.1 KiB
Markdown
57 lines
3.1 KiB
Markdown
# Архитектура ядра LISA
|
|
|
|
LISA — **capability-based микроядро**. Вся физическая память управляется через систему capability (прав доступа к объектам). Ядро использует загрузчик **Limine** (протокол Limine boot protocol).
|
|
|
|
## Общая схема
|
|
|
|
```
|
|
kmain()
|
|
├── BitmapPMM.init() ── глобальный менеджер фреймов
|
|
├── LAPIC.init() ── доступ к Local APIC
|
|
├── PageTable::activate() ── включение страничной памяти
|
|
├── SlabAllocator.init() ── куча ядра
|
|
├── VMM::init_kernel_space() ── адресное пространство ядра
|
|
├── IDT::load() ── обработчики прерываний
|
|
├── PMRouter::init() ── 65536 каналов
|
|
├── CNode (cap тест) ── insert → mint → revoke
|
|
│ └── RevocationQueue.push() ── уведомление VMM
|
|
└── PMActor тест
|
|
├── PMRouter.alloc_channel()
|
|
├── PMActor.submit_request()
|
|
├── PMActor.process_messages()
|
|
└── BuddyAllocator (внутри PMActor)
|
|
```
|
|
|
|
## Поток ревокации
|
|
|
|
```
|
|
CNode::revoke()
|
|
→ RevocationQueue.push(token_sig)
|
|
→ (page fault handler)
|
|
→ process_deferred_mmu_events()
|
|
→ AddressSpace::process_pending_revocations()
|
|
→ RevocationQueue.pop()
|
|
→ AddressSpace::revoke_by_token(token) // анмаппинг VMA
|
|
→ TLB flush
|
|
```
|
|
|
|
## Поток PMActor запроса
|
|
|
|
```
|
|
1. PMRouter::alloc_channel() → получаем channel_id
|
|
2. PMActor::submit_request(Allocate { channel_id, ... })
|
|
3. (актор обрабатывает) PMActor::process_messages()
|
|
4. PMActor::handle_allocate() → BuddyAllocator::alloc_pages()
|
|
5. PMRouter::route_responses([PMResponse { channel_id, result }])
|
|
6. PMRouter::wait_for_response(channel_id) → spin до READY
|
|
7. Возврат результата клиенту
|
|
```
|
|
|
|
## Ключевые принципы
|
|
|
|
- **Lock-free очереди** — MPSC кольцевые буферы везде, где возможен контеншен (PMActorQueue, RevocationQueue, PMRouter channels)
|
|
- **Double-write logging** — каждое сообщение дублируется в фреймбуфер (консоль) и последовательный порт
|
|
- **HHDM** — Higher Half Direct Map: весь физическая память отображена 1:1 в верхней половине адресного пространства через HHDM offset
|
|
- **ASID/PCID** — аппаратная изоляция TLB между адресными пространствами
|
|
- **Распределённое управление памятью** — PMM выделяет только сырые фреймы, PMActor управляет диапазонами через BuddyAllocator
|