HNX 开发优先级

本文档定义 HNX 微内核操作系统的开发优先级和路线图。

当前状态 (2026-01-27)

✅ Phase 0-6: 内核基础设施(已完成)
✅ Phase 7: 用户空间框架(已完成)
✅ Phase 7.5: 用户态支持(已完成)
✅ Phase 8: 用户空间 Workspace 重构(已完成)
✅ Phase 8.5: MMU 启用成功(已完成)
✅ Phase 8.5: 存储子系统(已完成)- 2026-01-21
✅ Phase 9: 文件系统实现(已完成)- 2026-01-22
🔴 用户空间执行问题(调查中发现)- 2026-01-27

⚠️ 用户空间执行问题 (2026-01-27)

问题描述

ERET 到 EL0 成功(看到 "UE" 输出),但用户空间代码无法执行。

发现的问题

  1. ERET 正常工作: return_to_user.s 执行,"UE" 输出显示 ERET 成功
  2. ELF PT_LOAD 损坏: userboot.elf 的 PT_LOAD 段只有 60 字节(code 在 0x10430+,但 segment 结束于 0x13C)
  3. QEMU ELF loader: 使用 p_vaddr 而非指定的 addr 参数
  4. 代码复制失败: 无法将代码复制到用户空间 VA

关键地址映射

L1 索引计算(64KB granule, T0SZ=16, 1GB per L1 entry):
- L1[0]: VA 0x00000000 - 0x3FFFFFFF (UART, VirtIO)
- L1[1]: VA 0x40000000 - 0x7FFFFFFF (内核, 用户空间)

L2 索引计算:
- VA 0x09000000 >> 29 = 18 (UART)
- VA 0x40410000 >> 29 = 130 (用户代码)

当前页面属性:
- userboot L2[130]: attr=0x301 (Normal RAM, 可执行)
- UART L2[18]: attr=0x401 (Device, 可访问)

待调查项

  1. ✅ ERET 确实执行 - "UE" 输出
  2. ⏳ 用户空间代码是否可执行 - 代码复制失败
  3. ⏳ 页面权限是否正确 - 需要验证
  4. ⏳ const/static 数组是否正确初始化

优先级列表

🔴 P0 - 立即修复

ID 任务 状态 说明
P0-1 MMU 启用 ✅ 已完成 TTBR0, L1 entry 修复
P0-2 共享内存通信 ✅ 已完成 VA 0x41000000 → PA 0x41000000
P0-3 VirtIO 存储检测 ✅ 已完成 设备地址 0x10000000
P0-4 文件系统 syscall ✅ 已完成 sys_open/read/write/close
P0-5 execve syscall ✅ 已完成 ELF 加载器
P0-6 用户空间执行 🔴 调查中 ERET 成功但代码不执行

🟡 P1 - 核心功能

ID 任务 状态 说明
P1-1 用户空间稳定性 🔴 阻塞 需先解决执行问题
P1-2 HandleTable 修复 ⏳ 待开始 dispatch 创建空 HandleTable
P1-3 服务框架完善 ⏳ 待开始 VFS, Loader, IPC 服务

🟢 P2 - 增强功能

ID 任务 状态 说明
P2-1 错误处理 ⏳ 待开始 Status 返回值完善
P2-2 多任务支持 ⏳ 待开始 调度器完善

🔵 P3 - 未来规划

ID 任务 状态 说明
P3-1 ohl 格式 ⏸️ 延后 压缩、签名、动态链接
P3-2 网络子系统 ⏳ 待定 TCP/IP 栈
P3-3 图形显示 ⏳ 待定 Framebuffer / GPU
P3-4 文件系统扩展 ⏳ 待定 FAT32, ext4

调试步骤

1. 验证用户空间内存访问

// 在 kernel 中测试
let ptr = 0x40410000 as *mut u8;
core::ptr::write(ptr, 0xAB);  // 写入
let val = core::ptr::read(ptr);  // 读取

2. 验证页面映射

QEMU monitor: info tlb
检查 VA 0x40410000 的映射条目

3. 验证代码字节

// 确认 static const 数组内容正确
static CODE: [u8; 20] = [...];
// 检查 CODE[0] 是否为 0x00

4. 简化测试用例

// 最简用户代码
movz x0, #0x58      // 'X'
b .                 // 无限循环

地址映射 (当前配置)

内核空间 (TTBR1_EL1, identity-mapped):
- 0x40000000 - 0x50000000: 内核代码和数据

用户空间 (TTBR0_EL1):
- L1[0]: VA 0x0 - 0x3FFFFFFF
  - L2[18]: VA 0x09000000 → PA 0x09000000 (UART)
  - L2[320-323]: VA 0xA000000 - 0xD000000 (VirtIO)

- L1[1]: VA 0x40000000 - 0x7FFFFFFF
  - L2[130]: VA 0x40400000 → PA 0x40400000 (用户代码)
  - L2[65]: VA 0x41000000 → PA 0x41000000 (共享内存)

技术要点

ARM64 MMU 配置

TCR_EL1:
- T0SZ=16 (VA 范围 2^(64-16) = 256TB, 实际使用低 48 位)
- TG1=11 (64KB granule for L1)
- IPS=2 (40-bit physical, 1TB)

MAIR_EL1:
- AttrIdx0: Device memory (0x00)
- AttrIdx1: Normal RAM (0xFF)

页面属性 (L2 entry):
- bit[0]: Valid
- bit[1]: AF (Accessed)
- bit[2]: UXN (Unprivileged Execute Never)
- bit[10]: PXN (Privileged Execute Never)
- bit[11]: Contiguous
- bit[58:56]: Attribute index
- bit[47:30]: Output address (PA[47:30])

L1/L2 索引计算

L1 索引 = VA[38:30] (1GB 粒度)
L2 索引 = VA[29:21] (64KB granule, 32MB per entry)

示例 - VA 0x40410000:
- L1 索引 = (0x40410000 >> 30) & 0x1FF = 1
- L2 索引 = (0x40410000 >> 21) & 0x1FF = 130

文档索引

文档 说明
AGENTS.md 开发指南
requirements/done.md 已完成工作归档
requirements/README.md 总体需求
README.md 项目说明
requirements/v1.0.0.md v1.0.0 开发计划

更新历史

日期 版本 变更
2026-01-19 v1 初始版本
2026-01-19 v2 SimpleFS 基础测试通过
2026-01-20 v3 MMU 启用成功
2026-01-21 v4 U-Boot 模式搁置,Makefile 完成
2026-01-22 v5 Phase 9 文件系统完成
2026-01-26 v6 Phase 10 ohl 格式规划
2026-01-27 v7 用户空间执行问题记录,P1-1 阻塞