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" 输出),但用户空间代码无法执行。
发现的问题
- ERET 正常工作: return_to_user.s 执行,"UE" 输出显示 ERET 成功
- ELF PT_LOAD 损坏: userboot.elf 的 PT_LOAD 段只有 60 字节(code 在 0x10430+,但 segment 结束于 0x13C)
- QEMU ELF loader: 使用 p_vaddr 而非指定的 addr 参数
- 代码复制失败: 无法将代码复制到用户空间 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, 可访问)
待调查项
- ✅ ERET 确实执行 - "UE" 输出
- ⏳ 用户空间代码是否可执行 - 代码复制失败
- ⏳ 页面权限是否正确 - 需要验证
- ⏳ 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. 验证用户空间内存访问
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 CODE: [u8; 20] = [...];
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 阻塞 |