486 lines
8.1 KiB
Markdown
486 lines
8.1 KiB
Markdown
# UTSM 设计架构记录
|
||||
|
|
|
|||
|
|
本文记录 Deshab 内核当前 UTSM 相关架构定稿。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. 架构目标
|
|||
|
|
|
|||
|
|
UTSM 的目标不是传统强安全隔离,而是在极高权限、极高效率的单地址空间 Ring0 内核中提供一种封缄内存模型。
|
|||
|
|
|
|||
|
|
核心目标:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
所有普通内存可读,但默认是密文。
|
|||
|
|
明文读写必须通过 UTRW。
|
|||
|
|
UUID 作为进程和内存段的调谐因子。
|
|||
|
|
数据区保持连续,避免 UUID 孔洞。
|
|||
|
|
DRR 提供 root key、checkpoint、recovery log 和回滚。
|
|||
|
|
调度器保持 O(1)。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. 总架构模块
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Deshab Kernel Core
|
|||
|
|
|
|||
|
|
SAS-R0-PCQ
|
|||
|
|
单地址空间 Ring0 任务模型
|
|||
|
|
Per-CPU O(1) 位图调度器
|
|||
|
|
|
|||
|
|
DRR
|
|||
|
|
Dedicated Recovery Root
|
|||
|
|
专用恢复根
|
|||
|
|
watchdog / root key / checkpoint / recovery log / A-B rollback
|
|||
|
|
|
|||
|
|
UTSM
|
|||
|
|
UUID-Tuned Sealed Memory
|
|||
|
|
UUID 调谐封缄内存
|
|||
|
|
|
|||
|
|
UTRW
|
|||
|
|
UTSM Tagged Reader/Writer
|
|||
|
|
UTSM 带标记读写器
|
|||
|
|
|
|||
|
|
DMP
|
|||
|
|
Descriptor Meta Page
|
|||
|
|
段描述符元页
|
|||
|
|
|
|||
|
|
PCKC
|
|||
|
|
Per-CPU Key Cache
|
|||
|
|
每 CPU 密钥缓存
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 3. UTSM 内存模型
|
|||
|
|
|
|||
|
|
每个 UTSM 段由两部分组成:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
DMP + Cipher Data
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
布局:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
+-------------------------------+
|
|||
|
|
| DMP: Descriptor Meta Page |
|
|||
|
|
+-------------------------------+
|
|||
|
|
| Cipher Data Page 0 |
|
|||
|
|
+-------------------------------+
|
|||
|
|
| Cipher Data Page 1 |
|
|||
|
|
+-------------------------------+
|
|||
|
|
| Cipher Data Page 2 |
|
|||
|
|
+-------------------------------+
|
|||
|
|
| ... |
|
|||
|
|
+-------------------------------+
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
规则:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
DMP 不属于用户数据。
|
|||
|
|
Cipher Data 只存密文。
|
|||
|
|
UUID 不插入 Cipher Data。
|
|||
|
|
数据区保持连续。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 4. 关键设计替代
|
|||
|
|
|
|||
|
|
从原始构想到 UTSM v1 的替代关系:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
十进制 UUID
|
|||
|
|
-> 128-bit 二进制 UUID
|
|||
|
|
|
|||
|
|
UUID 数字间隔插入内存
|
|||
|
|
-> 独立 DMP 元数据页
|
|||
|
|
|
|||
|
|
UUID 数字位置表
|
|||
|
|
-> segment_slot + generation + tweak_seed
|
|||
|
|
|
|||
|
|
十进制凯撒
|
|||
|
|
-> UUID 调谐的 cache-line 流式加密
|
|||
|
|
|
|||
|
|
每次传统 syscall
|
|||
|
|
-> Ring0 fast accessor + PCKC
|
|||
|
|
|
|||
|
|
写入时避开 UUID
|
|||
|
|
-> 连续密文数据区直接写
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 5. 数据结构架构
|
|||
|
|
|
|||
|
|
### 5.1 uuid128_t
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
typedef struct {
|
|||
|
|
uint64_t hi;
|
|||
|
|
uint64_t lo;
|
|||
|
|
} uuid128_t;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5.2 utsm_process_context
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
struct utsm_process_context {
|
|||
|
|
uuid128_t process_uuid;
|
|||
|
|
uint64_t crypto_epoch;
|
|||
|
|
uint64_t recovery_generation;
|
|||
|
|
uint32_t capability_table_slot;
|
|||
|
|
uint32_t capability_count;
|
|||
|
|
uint32_t flags;
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5.3 utsm_segment_desc
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
struct utsm_segment_desc {
|
|||
|
|
uuid128_t segment_uuid;
|
|||
|
|
uuid128_t owner_process_uuid;
|
|||
|
|
void *cipher_base;
|
|||
|
|
uint64_t cipher_length;
|
|||
|
|
void *dmp_base;
|
|||
|
|
uint64_t key_epoch;
|
|||
|
|
uint64_t tweak_seed;
|
|||
|
|
void *dirty_bitmap;
|
|||
|
|
void *mac_table;
|
|||
|
|
uint32_t generation;
|
|||
|
|
uint32_t flags;
|
|||
|
|
uint32_t state;
|
|||
|
|
uint32_t last_cpu;
|
|||
|
|
uint64_t writer_seq;
|
|||
|
|
uint64_t checkpoint_generation;
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5.4 utsm_dmp
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
struct utsm_dmp {
|
|||
|
|
uint64_t magic;
|
|||
|
|
uint32_t version;
|
|||
|
|
uint32_t segment_slot;
|
|||
|
|
uint64_t fast_base;
|
|||
|
|
uint64_t fast_limit;
|
|||
|
|
uint64_t fast_tweak_seed;
|
|||
|
|
uint64_t fast_key_epoch;
|
|||
|
|
uint64_t dirty_bitmap_base;
|
|||
|
|
uint64_t mac_table_base;
|
|||
|
|
uint64_t last_writer_seq;
|
|||
|
|
uint32_t last_cpu;
|
|||
|
|
uint32_t flags;
|
|||
|
|
uint64_t crc;
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5.5 utsm_capability
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
struct utsm_capability {
|
|||
|
|
uint32_t segment_slot;
|
|||
|
|
uint32_t generation;
|
|||
|
|
uint32_t rights;
|
|||
|
|
uint32_t epoch;
|
|||
|
|
uint64_t uuid_digest;
|
|||
|
|
uint64_t auth_tag;
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 6. UTRW 读写器架构
|
|||
|
|
|
|||
|
|
UTRW 分三层:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Level 0: Raw Access
|
|||
|
|
直接访问 cipher_base,读到密文。
|
|||
|
|
|
|||
|
|
Level 1: Fast Path
|
|||
|
|
capability O(1) 定位段。
|
|||
|
|
PCKC 命中。
|
|||
|
|
无全局锁。
|
|||
|
|
无 trap。
|
|||
|
|
|
|||
|
|
Level 2: Slow Path
|
|||
|
|
key miss。
|
|||
|
|
epoch mismatch。
|
|||
|
|
checkpoint/recovery。
|
|||
|
|
MAC fail。
|
|||
|
|
poisoned segment。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
读写基本流程:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Read:
|
|||
|
|
cap -> segment desc -> PCKC key -> 64B line 解密 -> 返回明文
|
|||
|
|
|
|||
|
|
Write:
|
|||
|
|
cap -> segment desc -> PCKC key -> 64B line 加密 -> 写密文 -> dirty bitmap -> recovery log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 7. DRR 协作架构
|
|||
|
|
|
|||
|
|
DRR 保存:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
root_key 或 root_key handle
|
|||
|
|
global_crypto_epoch
|
|||
|
|
segment table snapshot
|
|||
|
|
DMP snapshot
|
|||
|
|
dirty shard summary
|
|||
|
|
dirty bitmap
|
|||
|
|
MAC root
|
|||
|
|
recovery log
|
|||
|
|
poisoned segment list
|
|||
|
|
Boot Control Block
|
|||
|
|
DRR Emergency Pool
|
|||
|
|
A/B checkpoint metadata slot
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
DRR 负责:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
watchdog 检测
|
|||
|
|
freeze-all
|
|||
|
|
checkpoint
|
|||
|
|
page rollback
|
|||
|
|
segment rollback
|
|||
|
|
system rollback
|
|||
|
|
A/B 镜像回滚
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 8. Checkpoint / Rollback 架构
|
|||
|
|
|
|||
|
|
Checkpoint 类型:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Light Checkpoint
|
|||
|
|
控制面快照。
|
|||
|
|
|
|||
|
|
Dirty Page Checkpoint
|
|||
|
|
dirty ciphertext page 快照。
|
|||
|
|
|
|||
|
|
Boot Checkpoint
|
|||
|
|
启动状态和 A/B slot 信息。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 8.1 Dirty Shard
|
|||
|
|
|
|||
|
|
Dirty Bitmap 采用分片结构。
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Dirty Shard
|
|||
|
|
dirty_count
|
|||
|
|
shard_id
|
|||
|
|
page_base
|
|||
|
|
page_count
|
|||
|
|
last_checkpoint_epoch
|
|||
|
|
bitmap
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
checkpoint 时:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
dirty_count == 0 的 shard 直接跳过。
|
|||
|
|
dirty_count > 0 的 shard 才扫描 dirty bit。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
这样 checkpoint 成本为:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
O(number_of_dirty_shards + number_of_dirty_pages)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 8.2 A/B Checkpoint Metadata
|
|||
|
|
|
|||
|
|
checkpoint metadata 使用双槽:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Checkpoint Metadata Slot A
|
|||
|
|
Checkpoint Metadata Slot B
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
写入规则:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
写 inactive slot
|
|||
|
|
写 metadata / dirty index / MAC root / CRC
|
|||
|
|
flush
|
|||
|
|
原子切换 active slot
|
|||
|
|
旧 slot 作为 fallback
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
恢复规则:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
active slot 有效 -> 使用 active
|
|||
|
|
active slot 无效 -> fallback 另一个 slot
|
|||
|
|
双槽都无效 -> system rollback
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 8.3 DRR Emergency Pool
|
|||
|
|
|
|||
|
|
DRR 独立预留紧急内存池。
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
DRR Emergency Pool
|
|||
|
|
DRR private stack
|
|||
|
|
recovery log buffer
|
|||
|
|
checkpoint metadata buffer
|
|||
|
|
crash buffer
|
|||
|
|
metadata slab
|
|||
|
|
emergency pages
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
约束:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
普通 allocator 不可使用。
|
|||
|
|
普通 OOM 不影响 DRR recovery。
|
|||
|
|
DRR recovery 路径禁止依赖普通堆分配器。
|
|||
|
|
Emergency Pool 耗尽时进入 system rollback。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Rollback 级别:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Page Rollback
|
|||
|
|
单页恢复。
|
|||
|
|
|
|||
|
|
Segment Rollback
|
|||
|
|
整段恢复。
|
|||
|
|
|
|||
|
|
System Rollback
|
|||
|
|
重启并由 bootloader 切换 last_good_slot。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 9. 与 SAS-R0-PCQ 的整合
|
|||
|
|
|
|||
|
|
UTSM Task 是:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Ring0 调度实体
|
|||
|
|
+ process_uuid
|
|||
|
|
+ crypto context
|
|||
|
|
+ capability table
|
|||
|
|
+ encrypted stack/heap
|
|||
|
|
+ PCKC hot hint
|
|||
|
|
+ DRR recovery generation
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
调度切换:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
schedule()
|
|||
|
|
-> utsm_switch_out(old)
|
|||
|
|
-> pick_next_task()
|
|||
|
|
-> utsm_switch_in(next)
|
|||
|
|
-> context_switch(old, next)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
调度路径只允许:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
设置 crypto 指针
|
|||
|
|
加载 process_uuid
|
|||
|
|
预热 hot_segment_hint
|
|||
|
|
标记 PWC dirty flush
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
禁止:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
扫描段
|
|||
|
|
扫描 capability table
|
|||
|
|
计算 MAC
|
|||
|
|
写 checkpoint
|
|||
|
|
重加密整段
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 10. 启动顺序
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Bootloader
|
|||
|
|
-> 读取 Boot Control Block
|
|||
|
|
-> 选择 active_slot / last_good_slot
|
|||
|
|
-> 加载 SYSTEM/boot/utsm.elf
|
|||
|
|
-> 传入 memory map 和 DRR region
|
|||
|
|
|
|||
|
|
DRR Init
|
|||
|
|
-> 初始化 watchdog
|
|||
|
|
-> 建立 root key handle
|
|||
|
|
-> 初始化 recovery log
|
|||
|
|
-> 初始化 checkpoint region
|
|||
|
|
-> 初始化 heartbeat page
|
|||
|
|
-> 初始化 DRR Emergency Pool
|
|||
|
|
-> 初始化 A/B checkpoint metadata slot
|
|||
|
|
|
|||
|
|
UTSM Init
|
|||
|
|
-> 初始化 global crypto epoch
|
|||
|
|
-> 初始化 segment table
|
|||
|
|
-> 初始化 DMP pool
|
|||
|
|
-> 初始化 PCKC area
|
|||
|
|
-> 初始化 dirty shard pool
|
|||
|
|
-> 初始化 dirty bitmap / MAC table pool
|
|||
|
|
-> 注册 UTRW fast path / slow path
|
|||
|
|
|
|||
|
|
Scheduler Init
|
|||
|
|
-> 初始化 per-CPU runqueue
|
|||
|
|
-> 初始化 per-CPU heartbeat
|
|||
|
|
-> 初始化每 CPU PCKC
|
|||
|
|
-> 创建 bootstrap task
|
|||
|
|
-> 创建核心服务 task
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 11. 当前定稿边界
|
|||
|
|
|
|||
|
|
UTSM v1 确定:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
加密粒度:64B cache line
|
|||
|
|
Dirty 粒度:4KB page
|
|||
|
|
Dirty 分片:Dirty Shard
|
|||
|
|
MAC 粒度:4KB page
|
|||
|
|
段定位:O(1)
|
|||
|
|
调度额外成本:O(1)
|
|||
|
|
checkpoint 成本:O(dirty shards + dirty pages)
|
|||
|
|
checkpoint metadata:A/B 双槽,CRC 校验,原子切换
|
|||
|
|
DRR recovery 内存:Emergency Pool 独立预留
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
暂不追求:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
完整 RAM 原地回滚
|
|||
|
|
对恶意 Ring0 代码的强安全隔离
|
|||
|
|
设备外部副作用回滚
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
设备恢复策略:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
内存恢复后,设备 reset/reinit。
|
|||
|
|
磁盘依赖文件系统 journal。
|
|||
|
|
网卡 TX 已发包不回滚,RX/TX ring 重建。
|
|||
|
|
```
|