# Архитектура ядра 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