Files
Elyz/kernel/docs/capability/descriptors.md
2026-07-07 16:40:41 +03:00

4.0 KiB
Raw Permalink Blame History

Дескрипторы capability: descriptor.rs

Назначение

Файл определяет базовые типы capability-системы: что такое capability, какие бывают объекты, права и отношения.

CapObject — что представляет capability

pub enum CapObject {
    Empty,                              // Пустой слот
    Memory { phys: PhysAddr, size_pages: usize },  // Фрейм памяти
    CNode { phys: PhysAddr, slots: usize },         // Другой CNode
    PMActor { id: u64 },                             // PM Actor
}

Memory

Capability на физическую память:

  • phys — физический адрес начала.
  • size_pages — размер в страницах.

CNode

Capability на другой CNode:

  • phys — физический адрес CNode.
  • slots — количество слотов.

PMActor

Capability на PMActor:

  • id — уникальный идентификатор актора.

Empty

Слот пуст. is_valid() возвращает false.

CapRights — права доступа

bitflags! {
    pub struct CapRights: u8 {
        const READ    = 1 << 0;  // 0x01 — чтение
        const WRITE   = 1 << 1;  // 0x02 — запись
        const EXECUTE = 1 << 2;  // 0x04 — исполнение
        const GRANT   = 1 << 3;  // 0x08 — разрешение на mint
    }
}

Правила:

  • Права дочернего capability = родительские_права & запрошенные_права.
  • Нельзя расширить права: если родитель не имеет GRANT, mint невозможен.
  • CapRights::all() = R | W | X | G = 0x0F.

Relation — тип связи

pub enum Relation {
    Strong,   // Владелец — сильная ссылка (объект жив, пока есть Strong)
    Borrow,   // Заёмщик — временный доступ
    Transfer, // Передача — владение переходит без возможности отзыва
}
  • Strong: capability владеет объектом. При revoke, объект может быть уничтожен или возвращён пулу.
  • Borrow: capability предоставляет временный доступ. При revoke родителя, borrow-потомки тоже отзываются.
  • Transfer: полная передача владения. Используется при IPC.

Capability — полный дескриптор

#[derive(Debug, Clone, Copy)]
pub struct Capability {
    pub object: CapObject,    // Целевой объект
    pub rights: CapRights,    // Права доступа
    pub relation: Relation,   // Тип связи
    pub token_sig: u64,       // Уникальный подписывающий токен
}

token_sig — назначение

  • Уникальный 64-битный идентификатор capability.
  • Используется для:
    1. Отзыва: при revoke, token_sig отправляется в MMU_REVOCATION_QUEUE.
    2. Идентификации в VMM: VMA хранят cap_token == token_sig.
    3. Отладки: каждый capability можно однозначно отследить.

Методы

impl Capability {
    pub const fn empty() -> Self {
        Self {
            object: CapObject::Empty,
            rights: CapRights::empty(),
            relation: Relation::Borrow,
            token_sig: 0,
        }
    }

    pub fn is_valid(&self) -> bool {
        !matches!(self.object, CapObject::Empty)
    }
}

token_sig = 0 зарезервирован для пустых/невалидных capability. token_sig = 0xDEAD_BEEF используется для сырых Untyped (не отправляется в MMU_REVOCATION_QUEUE, см. cap/mod.rs).