reverse-skills-max: initial public release (restored, redacted, hardened)

This commit is contained in:
baradok609hecl1pq6qi
2026-10-20 02:17:15 +03:00
commit da24c2bd20
2227 changed files with 443931 additions and 0 deletions

View File

@@ -0,0 +1,126 @@
# Quest-V:多内核 sandbox / 每 sandbox 一个 monitor / 故障与在线恢复
<CORE RULE>
不是"一个 hypervisor 管所有 VM",而是**多个 sandbox kernel,每个配一个自己的 monitor**:
```
sandbox domain = 一个或多个 CPU + 一块主机物理内存
(内含【本地 monitor】+ sandbox kernel + 本地应用)
monitor 只为【一个】sandbox 维护 EPT 映射
→ 省掉传统 hypervisor 调度/切换 guest 地址空间的开销
```
于是两条容易误判成"缺失"的现象其实是设计:
```
没有大量 VM-exit → sandbox 自己管 I/O
没有中央调度器/全局时钟 → 每 sandbox 自己调度、自己的物理时钟
```
</CORE RULE>
## 一、monitor 什么时候才被调用
**只在四件事上介入**:
```
① 引导各内核(bootstrapping)
② 处理故障(fault)
③ 管理与发起影子页表(shadow page tables)
④ 建立 sandbox 间通信通道
```
其余时间 **sandbox 直接在硬件上运行**。
- monitor 可以按**每核**建立,也可以为一个**核的集群**建立("域/单元")——**不是天然一核一 monitor**
- monitor 跟踪**影子页表映射**,这些映射表达**不可变的内存访问能力**,所以 **sandbox 代码无法修改"管辖主机内存访问的 EPT 映射"**
## 二、EPT 用于内存隔离,不是 CPU 虚拟化
- 用 EPT/嵌套页表主要是为了**内存隔离**(额外一层逻辑保护环),**指令直接在硬件执行**
- **sandbox kernel 的代码段实际是只读的**——因为 sandbox 代码**没有访问自己 EPT 映射的途径**
- 每个 sandbox 做**自己的本地调度与设备管理**
## 三、中断与 I/O:直接交给 sandbox
- **中断被定向到 sandbox kernel**(I/O APIC 广播或 IPI),并在驱动里做**早期解复用**——避免 monitor 介入与复杂的 I/O 虚拟化
- **部分驱动数据结构跨 sandbox 共享**,另一些是复制或同步的
## 四、sandbox 间通信
- **显式消息传递 + 共享内存通道**,传**缓存行大小**的消息
- 一个 sandbox 里的服务可以访问另一个 sandbox 里的服务
- **IPI 用于 sandbox 间通信**;APIC 机制**也用于重路由中断以做远程故障恢复**
## 五、故障路径(定位 monitor 的第一线索)
- 故障被检出时会产生 **EPT violation → 控制权转移(VM-exit)到对应的 monitor**
- **若某故障不会自动触发 VM-exit,故障处理器可以强制触发它**(例如用某条必然陷入的指令)
- sandbox kernel **只读段**里的故障检测代码被**假定安全**
- **抢占超时可周期性强制陷阱到 monitor**——这样**检测逻辑就位于 monitor 内**,与被篡改的 sandbox 隔离
## 六、恢复:本地与远程,都是在线的
- **本地恢复**:monitor 释放故障组件的内存、**可能重新初始化整个 sandbox**、或用**替代实现**替换组件(功能/实现多样性),并**通过调整该 sandbox 的 EPT 映射**来激活替代实现
- **远程恢复**:本地 monitor 选一个目标 sandbox(随机、轮转、或按负载),**经 IPI 通知**;远端 monitor 执行恢复,**经消息传递从共享内存取状态**
- 恢复**在线完成,不重启整机**;未受影响的 sandbox 继续正常运行
## 七、实操:手里这份映像,哪一段是 monitor
几个可用的判据(按可靠性排序):
1. **谁持有并修改 EPT 映射/影子页表**——这是 monitor 独有的能力(sandbox 代码无法访问自己的 EPT 映射)
2. **故障入口**:VM-exit 的目标、以及"强制触发陷入"的那条路径
3. **抢占超时的定时逻辑**:它被刻意放在 monitor 内与被篡改的 sandbox 隔离
4. **引导/通道建立代码**:只在启动与建通道时出现
反之,**大量设备驱动与本地调度逻辑属于 sandbox kernel,不是 monitor**。
## 八、时间与迁移
- **没有全局时钟**:每个 sandbox 有自己的物理时钟,事件计时由**每核本地定时器**管理,**不保证同步**
- 既没有全局调度器也没有全局时钟 → **跨 sandbox 迁移与通信的时序分析必须把时钟偏差算进去**(相关研究专门推导过含时钟偏差的通信界限)
- 跨 sandbox 的时间戳**不能按单一时间线比较**
## 决策树
```
拿到多内核 sandbox 系统的映像
├─ 找不到中央 hypervisor
│ └─ 正常:每 sandbox 一个 monitor
├─ VM-exit 很少
│ └─ 正常:sandbox 自己调度与管 I/O,中断直接投递
├─ 要定位 monitor
│ ├─ 谁持有/修改 EPT 与影子页表
│ ├─ VM-exit 目标与"强制触发陷入"路径
│ ├─ 抢占超时的定时逻辑
│ └─ 引导/建通道代码
├─ 故障与恢复
│ ├─ EPT violation → VM-exit 到对应 monitor
│ ├─ 本地恢复可重初始化整个 sandbox 或换实现(改 EPT 激活)
│ └─ 远程恢复经 IPI + 共享内存传状态,全程在线
├─ 跨 sandbox 通信
│ └─ 显式消息 + 共享内存通道(缓存行大小消息)+ IPI
└─ 时间线对不上
└─ 无全局时钟:各 sandbox 时钟不保证同步,别按单一时间线断言
```
## 工具与验证
- 资源:sandbox domain 到 CPU/内存/设备的映射
- monitor:EPT/影子页表、故障入口、抢占超时、引导与通道建立代码
- 通信:共享内存通道的消息流与 IPI
- 时间:各 sandbox 的本地时钟与偏差
- 验证:能同时说清「这段代码属于 monitor 还是 sandbox kernel + 该故障经哪条路径到 monitor + 这条跨域数据的时序基准是谁的时钟」
## 该平台的坑(汇总)
- **把"没有中央 hypervisor"当系统缺失**:每 sandbox 一个 monitor 是设计
- **把"VM-exit 很少"当没有虚拟化隔离**:指令直接在硬件跑是设计
- **以为 monitor 参与每次 I/O**:它只在引导、故障、影子页表、建通道时介入
- **把设备驱动当 monitor 的一部分**:驱动与本地调度属于 sandbox kernel
- **以为能改 EPT 映射**:sandbox 代码无法访问自己的 EPT 映射
- **把不同 sandbox 的时间戳按单一时间线比较**:没有全局时钟
- **以为恢复一定重启整机**:本地/远程恢复都在线进行
- **把"替代实现替换组件"当异常**:那是设计内的恢复手段
- **假设一核一 monitor**:monitor 可以按核集群建立