116 lines
4.0 KiB
Markdown
116 lines
4.0 KiB
Markdown
# Дескрипторы capability: `descriptor.rs`
|
||
|
||
## Назначение
|
||
|
||
Файл определяет базовые типы capability-системы:
|
||
что такое capability, какие бывают объекты, права и отношения.
|
||
|
||
## CapObject — что представляет capability
|
||
|
||
```rust
|
||
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 — права доступа
|
||
|
||
```rust
|
||
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 — тип связи
|
||
|
||
```rust
|
||
pub enum Relation {
|
||
Strong, // Владелец — сильная ссылка (объект жив, пока есть Strong)
|
||
Borrow, // Заёмщик — временный доступ
|
||
Transfer, // Передача — владение переходит без возможности отзыва
|
||
}
|
||
```
|
||
|
||
- **Strong**: capability владеет объектом. При revoke, объект может
|
||
быть уничтожен или возвращён пулу.
|
||
- **Borrow**: capability предоставляет временный доступ.
|
||
При revoke родителя, borrow-потомки тоже отзываются.
|
||
- **Transfer**: полная передача владения. Используется при IPC.
|
||
|
||
## Capability — полный дескриптор
|
||
|
||
```rust
|
||
#[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 можно однозначно отследить.
|
||
|
||
### Методы
|
||
|
||
```rust
|
||
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`).
|