This commit is contained in:
xyou
2026-07-31 13:53:49 +08:00
parent 5ea84fac97
commit f52157b7af
241 changed files with 26843 additions and 8155 deletions
+115 -173
View File
@@ -1,268 +1,210 @@
# Deshab-OS 开发路线图
> 本文档基于项目当前实现状态与各模块规划,给出分阶段开发路线。
> 状态标记:✅ 已完成 · 🔶 部分完成 · ⬜ 待实现
> 分阶段开发路线。✅已完成 · 🔶部分完成 · ⬜待实现
---
## 当前状态总览
Deshab-OS 已完成**可启动的实验内核**闭环:
```text
Limine → utsm.elf → DKM 14 驱动加载 → DSK (deshab.elf)
→ 旋转加载动画 → 首次启动检测
→ firstInit=0: mouseInit → FirstInit 用户设置向导(中文 UI / SHA256 密码)
→ firstInit≠0: 正常启动(待实现)
Limine → utsm.elf → DKM 14驱动 → DSK(deshab.elf)
→ firstInit=0: mouseInit→netman→FirstInit→user.conf写盘→desktop
→ firstInit≠0: login→desktop
```
| 子系统 | 状态 | 说明 |
|--------|------|------|
| 早期启动(serial/IDT/PIC) | ✅ | IDT 0–47,PIC remap 0x20–0x2f |
| UTSM 封缄内存 | 🔶 | selftest 闭环,占位 XOR stream,真实加密待实现 |
| DKM 驱动加载 | ✅ | 14/14 驱动 discovery + 加载闭环 |
| DMA 分配器 | ✅ | Limine USABLE → 物理页 bitmap,低 4G 钳位 |
| AHCI 块设备 | 🔶 | IDENTIFY/READ DMA + block provider,无 write |
| NVMe | 🔶 | PCI discovery only,BAR0 在 4G 以上待映射 |
| FAT32 | 🔶 | 只读,优先 block provider 回退 boot module |
| e1000 网络 | 🔶 | 完整 RX/TX ring,无协议栈 |
| virtio_net | 🔶 | PCI discovery + capability 枚举,无 virtqueue |
| 字体系统 | ✅ | DBF 格式 16/24/32px,GB2312 全覆盖 |
| FirstInit | 🔶 | 中文 UI + 键盘输入 + SHA256 密码,写盘待实现 |
| SAS-R0-PCQ 调度器 | ⬜ | 设计完成,未实现 |
| DRR 恢复根 | ⬜ | stub 占位,未实现 |
| 早期启动 | ✅ | IDT 0–47,PIC remap 0x20–0x2f |
| UTSM封缄内存 | 🔶 | selftest闭环,占位XOR stream |
| DKM驱动加载 | ✅ | 14/14闭环 |
| DMA分配器 | ✅ | 物理页bitmap,低4G钳位 |
| AHCI块设备 | ✅ | IDENTIFY/READ/WRITE DMA+ahci0 provider |
| NVMe | 🔶 | PCI discovery only,BAR0>4G待映射 |
| FAT32 | 🔶 | DKM只读;DSK读写(根目录) |
| e1000 | ✅ | RX/TX+DHCP/ARP/UDP/DNS,polling |
| 字体系统 | ✅ | DBF 16/24/32px,GB2312全覆盖 |
| FirstInit | 🔶 | UI+输入+SHA256密码+写盘;B6按键崩溃修复中 |
| 正常启动路径 | ✅ | login→desktop |
| SAS-R0-PCQ | ⬜ | 设计完成 |
| DRR | ⬜ | stub占位 |
---
## 路线图总览
```mermaid
graph LR
P0["Phase 0<br/>内存与 MMIO 底座"] --> P1["Phase 1<br/>DMA 与块设备数据路径"]
P1 --> P2["Phase 2<br/>IRQ 后端升级"]
P2 --> P3["Phase 3<br/>网络数据路径"]
P1 --> P4["Phase 4<br/>VFS 与真实块设备接入"]
P4 --> P5["Phase 5<br/>block write 与 FAT32 write"]
P5 --> P6["Phase 6<br/>FirstInit 完善"]
P2 --> P7["Phase 7<br/>SAS-R0-PCQ 调度器"]
P7 --> P8["Phase 8<br/>DRR 恢复系统"]
P8 --> P9["Phase 9<br/>真实加密落地"]
```
**优先级原则**(源自 [DSK README](../CODE/dsk/README) §7):
> 先让 UTSM 能加载并跳到 DSK → 再补内存/MMIO/DMA → 再做块设备真实读取 → 再迁移文件系统和网络数据路径 → 最后进入调度器和恢复系统深化。
---
## Phase 0 — 内存与 MMIO 底座
**目标**:建立物理页分配器、页表映射接口、高位 PCI MMIO 映射能力,解决 NVMe 4G 以上 BAR 和后续 DMA 映射问题。
## Phase 0 — 内存与MMIO底座
| 任务 | 状态 | 验收标准 |
|------|------|---------|
| 物理页 bitmap 分配器 | ✅ | Limine USABLE → bitmap,已根治 e1000 DMA |
| 页表映射接口(map/unmap) | ⬜ | 提供 `mmio_map(phys, size, flags)` 通用接口 |
| 高位 PCI MMIO 映射(4G 以上 BAR) | ⬜ | NVMe BAR0 可安全读取 register |
| 替换 arena 为真实页分配 | ⬜ | DKM 驱动加载使用物理页分配器,移除 16MB arena 上限 |
| 物理页bitmap分配器 | ✅ | 已根治e1000 DMA |
| 页表映射接口(map/unmap) | ⬜ | mmio_map(phys,size,flags)通用接口 |
| 高位PCI MMIO映射(4G以上BAR) | ⬜ | NVMe BAR0可安全读register |
| 替换arena为真实页分配 | ⬜ | 移除16MB arena上限 |
**依赖**:无(基础设施)
**风险**:页表操作需在关中断下小心进行;高位 MMIO 映射需建立独立页表项,避免破坏 HHDM。
风险:页表操作需关中断;高位MMIO需独立页表项避免破坏HHDM。
---
## Phase 1 — DMA 与块设备数据路径
**目标**:建立 contiguous DMA buffer、cache/屏障约定、PRDT/队列内存管理,推进 AHCI/NVMe 真实读写。
## Phase 1 — DMA与块设备数据路径
| 任务 | 状态 | 验收标准 |
|------|------|---------|
| DMA buffer 统一接口(alloc/sync_for_device/sync_for_cpu) | 🔶 | `dkm_dma_api` 已定义,cache 屏障约定待完善 |
| AHCI IDENTIFY/READ | ✅ | SATA 盘可读取 LBA0 |
| AHCI 多扇区批量 read 稳定化 | 🔶 | 256 扇区批量读成功,单扇区偶发超时待收敛 |
| AHCI block provider 注册 | ✅ | `ahci0` 注册到 `kernel_api.block` |
| NVMe admin queue / identify | ⬜ | 依赖 Phase 0 高位 MMIO |
| NVMe block provider | ⬜ | 注册 `nvme0`,支持 READ |
**依赖**:Phase 0
**风险**:AHCI command header 布局须严格按规范;不对 ATAPI/空端口发 ATA IDENTIFY。
| DMA buffer统一接口 | 🔶 | dkm_dma_api已定义,cache屏障待完善 |
| AHCI IDENTIFY/READ | ✅ | SATA盘可读LBA0 |
| AHCI WRITE DMA | ✅ | WRITE DMA EXT(0x35)已注册 |
| AHCI批量read稳定化 | 🔶 | 256扇区成功,单扇区偶发超时 |
| AHCI block provider | ✅ | ahci0已注册 |
| NVMe admin queue/identify | ⬜ | 依赖Phase 0高位MMIO |
| NVMe block provider | ⬜ | nvme0,支持READ |
---
## Phase 2 — IRQ 后端升级
**目标**:在 PIC fallback 稳定基础上扩展 IDT/vector allocator/APIC EOI/IOAPIC redirection,逐步迁移设备 IRQ,最后接入 MSI/MSI-X。
## Phase 2 — IRQ后端升级
| 任务 | 状态 | 验收标准 |
|------|------|---------|
| IDT 扩展到 256 vectors | 🔶 | 当前 0–47 stub |
| IDT扩展256 vectors | 🔶 | 当前0–47 |
| Vector allocator | ⬜ | 动态分配中断向量 |
| APIC EOI 后端 | ⬜ | 替代 PIC EOI |
| IOAPIC redirection | ⬜ | 迁移设备 IRQ 到 IOAPIC |
| LAPIC timer | ⬜ | 替代 PIT 作为调度时钟 |
| MSI / MSI-X | ⬜ | NVMe/e1000 使用 MSI-X |
| APIC EOI后端 | ⬜ | 替代PIC EOI |
| IOAPIC redirection | ⬜ | 迁移设备IRQ到IOAPIC |
| LAPIC timer | ⬜ | 替代PIT |
| MSI/MSI-X | ⬜ | NVMe/e1000使用MSI-X |
**依赖**:无(可与 Phase 1 并行)
**风险**:未扩展 IDT/vector allocator 前不能禁用 PIC 或重编 IOAPIC RTE,否则中断投递和 EOI 后端不一致。
风险:未扩展IDT前不能禁用PIC或重编IOAPIC RTE。
---
## Phase 3 — 网络数据路径
**目标**:在 DMA/IRQ 完成后推进 e1000 与 virtio-net 的完整收发能力。
| 任务 | 状态 | 验收标准 |
|------|------|---------|
| e1000 完整 RX/TX ring | ✅ | netdev flags `LINK_UP|TX_READY|RX_READY` |
| e1000 中断驱动收发 | ⬜ | 替代 polling,接 IOAPIC/MSI(依赖 Phase 2) |
| virtio-net feature negotiation | ⬜ | 完成 device_status / feature_select |
| virtio-net virtqueue RX/TX | ⬜ | 建队列、收发包 |
| 最小协议栈(ARP/IP/UDP/DHCP/DNS) | ⬜ | netman 可完成 DHCP 获取地址 |
**依赖**:Phase 1(DMA)、Phase 2(IRQ)
**风险**:网卡中断早期开启容易刷屏或阻塞,IOAPIC/MSI 完善前保持 masked,收发先走 polling。
| e1000 RX/TX ring | ✅ | LINK_UP+TX_READY+RX_READY |
| e1000中断驱动收发 | ⬜ | 替代polling(依赖Phase 2) |
| virtio-net feature negotiation | ⬜ | 完成 |
| virtio-net virtqueue RX/TX | ⬜ | 建队列收发包 |
| 最小协议栈 | ✅ | DHCP+ARP+DNS(netman闭环) |
---
## Phase 4 — VFS 与真实块设备接入
**目标**:将 FAT32 从测试镜像迁移到 AHCI/NVMe block provider,完善挂载、读取、目录遍历和错误路径。
## Phase 4 — VFS与真实块设备接入
| 任务 | 状态 | 验收标准 |
|------|------|---------|
| FAT32 接入真实 block provider | 🔶 | 优先 block provider,回退 boot module |
| FAT32 子目录路径解析 | ⬜ | 支持 `/system/deshab64/deshab.elf` 完整路径 |
| VFS 统一路径语义 | ⬜ | DSK 加载与 VFS 路径统一 |
| 目录遍历 | ⬜ | 支持枚举目录项 |
| 错误路径完善 | ⬜ | block read 失败 / BPB 无效正确回退 |
**依赖**:Phase 1(块设备)
| FAT32接入真实block provider | 🔶 | 优先block provider回退boot module |
| FAT32子目录路径解析 | ⬜ | 支持完整路径 |
| VFS统一路径语义 | ⬜ | DSK与VFS路径统一 |
| 目录遍历+错误路径完善 | ⬜ | 枚举目录项+正确回退 |
---
## Phase 5 — block write 与 FAT32 write
**目标**:实现块设备写和 FAT32 文件写入,支撑配置持久化。
## Phase 5 — block write与FAT32 write
| 任务 | 状态 | 验收标准 |
|------|------|---------|
| `dkm_block_api.write` | ⬜ | AHCI 实现 WRITE DMA |
| FAT32 文件创建 | ⬜ | 写目录项 |
| FAT32 FAT 链更新 | ⬜ | 分配新 cluster |
| FAT32 文件覆写 | ⬜ | user.conf / firstInit.txt 写盘 |
| firstInit.txt 标志写盘 | ⬜ | 首次启动后写 `1` |
| dkm_block_api.write | ✅ | AHCI WRITE DMA EXT已注册(@+0x18) |
| FAT32文件创建/FAT链更新/覆写 | ✅ | user.conf/firstInit.txt已写盘 |
| firstInit.txt标志写盘 | ✅ | dsk_persist_userconf写1\n+dev_mode |
**依赖**:Phase 1(块设备)、Phase 4(VFS)
注:写路径当前由DSK内嵌FAT32实现,DKM fat32驱动仍只读。
---
## Phase 6 — FirstInit 完善
**目标**:完善首次启动用户设置向导的完整功能。
## Phase 6 — FirstInit完善
| 任务 | 状态 | 验收标准 |
|------|------|---------|
| 修复 FirstInit 按键崩溃 | 🔶 | `fb_text` 在 `-O2` 下稳定 |
| 鼠标光标移动 | ⬜ | PS/2 IRQ12 + 包解码 + 光标更新 |
| user.conf 写盘 | ⬜ | 依赖 Phase 5 block write |
| 网络配置界面 | ⬜ | IP/DHCP/网关设置 |
| 时区/语言选择 | ⬜ | — |
| 设置完成后跳转正常启动 | ⬜ | 写 firstInit=1,跳转 DSK 正常路径 |
| 正常启动路径 | ⬜ | firstInit≠0 时的桌面/Shell |
**依赖**:Phase 3(网络)、Phase 5(写盘)
| 按键崩溃修复(B6) | 🔶 | fb_text在-O2下稳定 |
| 鼠标光标移动 | ⬜ | PS/2 IRQ12+包解码+光标 |
| user.conf写盘 | ✅ | 重启后login可读取 |
| 网络配置界面+时区/语言 | ⬜ | — |
| 设置完成后跳转+正常启动路径 | ✅ | FirstInit返回→持久化→desktop |
---
## Phase 7 — SAS-R0-PCQ 调度器
**目标**:实现单地址空间 Ring0 任务模型与 Per-CPU O(1) 位图调度器。
## Phase 7 — SAS-R0-PCQ调度器
| 任务 | 状态 | 验收标准 |
|------|------|---------|
| TCB 与 task_create 流程 | ⬜ | 分配 TCB、生成 process_uuid、创建 stack/heap 段、capability table |
| Per-CPU runqueue | ⬜ | 每 CPU 独立 runqueue |
| O(1) 位图调度器 | ⬜ | pick_next_task 为 O(1) |
| context_switch | ⬜ | utsm_switch_out / utsm_switch_in 只加载 crypto 指针 |
| task_kill crypto erase | ⬜ | owned segment key_epoch++,state=DESTROYED |
| SMP 多核 | ⬜ | 多核调度(可选,后续) |
| TCB+task_create | ⬜ | process_uuid+stack/heap段+cap table |
| Per-CPU runqueue | ⬜ | 每CPU独立 |
| O(1)位图调度器 | ⬜ | pick_next_task O(1) |
| context_switch | ⬜ | 只加载crypto指针 |
| task_kill crypto erase | ⬜ | key_epoch++, state=DESTROYED |
**依赖**:Phase 0(内存)
**风险**:调度切换路径禁止扫描 capability、计算 MAC、重加密——必须保持 O(1)。
风险:切换路径禁止扫描capability/计算MAC/重加密。
---
## Phase 8 — DRR 恢复系统
**目标**:实现专用恢复根的看门狗、checkpoint、recovery log、A-B 回滚。
## Phase 8 — DRR恢复系统
| 任务 | 状态 | 验收标准 |
|------|------|---------|
| DRR Emergency Pool | ⬜ | 独立紧急内存池,普通 allocator 不可用 |
| Watchdog | ⬜ | 独立于普通调度器 |
| Recovery log | ⬜ | WRITE_INTENT / WRITE_COMMIT log 对 |
| Dirty Shard + Dirty Bitmap | 🔶 | 数据结构已设计,实现待补 |
| A/B Checkpoint metadata 双槽 | ⬜ | CRC 校验 + 原子 active slot 切换 |
| Page / Segment / System Rollback | ⬜ | 三级回滚 |
| 驱动 recovery ops(quiesce/reset/reinit) | ⬜ | DRR 驱动故障恢复 |
| Emergency Pool+Watchdog+Recovery log | ⬜ | 独立内存池+独立调度器 |
| Dirty Shard+Bitmap | 🔶 | 数据结构已设计 |
| A/B Checkpoint双槽 | ⬜ | CRC+原子active slot切换 |
| Page/Segment/System Rollback | ⬜ | 三级回滚 |
| 驱动recovery ops | ⬜ | quiesce/reset/reinit |
**依赖**:Phase 7(调度器)、UTSM 真实加密(Phase 9)
**风险**:恢复路径禁止依赖普通堆;checkpoint 提交顺序固定不可调;Emergency Pool 耗尽直接 system rollback。
风险:恢复路径禁用普通堆;Emergency Pool耗尽→system rollback。
---
## Phase 9 — 真实加密落地
**目标**:将 UTSM 占位 XOR stream 替换为真实加密原语。
| 任务 | 状态 | 验收标准 |
|------|------|---------|
| 确定加密原语(KDF/hash/stream/MAC) | ⬜ | 选定 HKDF/BLAKE2/AES-CTR/Poly1305 等 |
| KDF 实现 | ⬜ | `segment_key = KDF(root_key, process_uuid, segment_uuid, key_epoch)` |
| Stream cipher 实现 | ⬜ | 64B cache line 级加解密 |
| MAC 实现 | ⬜ | 4KB page 粒度 MAC |
| DRR root key 管理 | ⬜ | root key 生成 / 存储 / 轮换 |
| PCKC key schedule 缓存 | ⬜ | 真实 key schedule 而非占位 |
| 加密原语选型 | ⬜ | HKDF/BLAKE2/AES-CTR/Poly1305 |
| KDF+Stream cipher(64B line)+MAC(4KB page) | ⬜ | 占位XOR替换 |
| DRR root key管理+PCKC key schedule | ⬜ | 真实key schedule |
**依赖**:Phase 8(DRR root key)
**风险**:加密原语需在 `-mno-sse` 下可用(或在此阶段启用 SSE/SIMD);性能需保持热路径 O(1)。
风险:加密原语需在-mno-sse下可用(或此阶段启用SSE/SIMD)。
---
## DKM 工程化收尾(贯穿各阶段)
## 用户态与生态主线
| 任务 | 状态 | 验收标准 |
|------|------|---------|
| 统一驱动本地 ABI 公共头 | ⬜ | 移除各驱动内联 `dkm_kernel_api` 定义 |
| kernel_api typed sub-struct 迁移 | ⬜ | `const void *` 占位 → typed 指针 |
| 清理编译 warning | ⬜ | `-Wall -Wextra` 零警告 |
| QEMU 场景自动化 | ⬜ | e1000/virtio-net/nvme/ahci 独立测试场景 |
| log API printf 变参支持 | ⬜ | 统一为 `(*info)(const char *fmt, ...)` |
| 子系统 | 状态 | 说明 |
|--------|------|------|
| desktop.elf | ✅ | 三页面+窗口+任务栏+双命令行+6应用+双缓冲 |
| shell.elf | ✅ | linux/cp/mv/echo/ls/cat/rm+/bin+lls/lcat+Tab补全 |
| cmd.elf | ✅ | Windows风格+pe/peinfo |
| login.elf | ✅ | USER.CONF+skip_login |
| PE/EXE兼容层 | ✅ | PE32+原生/PE32走x86emu32 |
| Linux兼容层 | 🔶 | VMM+park-and-resume+IPC exec+文件传输;**VMX运行时验证待VT-x/KVM** |
| virtio-mmio模拟 | 🔶 | blk/net/rootfs后端;未在真实guest验证 |
| Pacman | ⬜ | 五阶段方案;Arch rootfs已含pacman |
主线依赖:VMX环境→Arch guest pacman→文件传输/命令委托→desktop Linux图标集成。
---
## DKM工程化收尾
| 任务 | 状态 |
|------|------|
| 统一驱动ABI公共头 | ⬜ |
| kernel_api typed sub-struct迁移 | ⬜ |
| 零warning | ⬜ |
| QEMU场景自动化 | ⬜ |
| log API printf变参 | ⬜ |
---
## 里程碑
| 里程碑 | 完成阶段 | 标志 |
|--------|---------|------|
| **M1 — 真实块设备启动** | Phase 0+1+4 | 从 AHCI/NVMe FAT32 读取 deshab.elf,脱离 test.fat32 |
| **M2 — 配置持久化** | Phase 5+6 | FirstInit 设置可写盘,重启后正常启动 |
| **M3 — 网络可用** | Phase 2+3 | DHCP 获取地址,可收发 UDP |
| **M4 — 多任务调度** | Phase 7 | SAS-R0-PCQ 调度器运行多任务 |
| **M5 — 容错恢复** | Phase 8+9 | DRR checkpoint/rollback + 真实加密 |
| 里程碑 | 阶段 | 标志 |
|--------|------|------|
| M1 真实块设备启动 | Phase 0+1+4 | 从AHCI/NVMe FAT32读deshab.elf |
| M2 配置持久化 | Phase 5+6 | FirstInit设置可写盘,重启后正常启动 |
| M3 网络可用 | Phase 2+3 | DHCP+UDP收发 |
| M4 多任务调度 | Phase 7 | SAS-R0-PCQ多任务 |
| M5 容错恢复 | Phase 8+9 | DRR checkpoint/rollback+真实加密 |
---
## 相关文档
- [架构设计文档](./ARCHITECTURE.md)
- [贡献与协作规范](../CONTRIBUTING.md)
- [CLAUDE.md](../CLAUDE.md) — 项目当前状态与下一阶段路线
- [LESSONS_LEARNED.md](../LESSONS_LEARNED.md) — 开发经验教训
- [ARCHITECTURE.md](./ARCHITECTURE.md)
- [BOOT_SEQUENCE.md](./BOOT_SEQUENCE.md)
- [兼容层设计.md](./兼容层设计.md)
- [桌面设计.md](./桌面设计.md)
- [系统开发策划.md](./系统开发策划.md)
- [CLAUDE.md](../CLAUDE.md)