1、立项背景和目标
SparrowOS 是一个不依赖现成内核、不套用 Linux 代码的 x86-64 宏内核,从 UEFI 固件交接开始逐层自建。立项初衷是摆脱“调库式”的操作系统学习:不使用 libc/STL,不借用现成引导器与驱动框架,把引导、页表、内存、调度、驱动、调试全部亲手实现,让每一行代码都可解释、可观测、可复现;并以多核调度、NVMe 存储等现代先进计算机气氛底层能力为切入点,理解云计算基础设施。目标分三段:先打通真机启动与中断/调度运行时;再补齐 NVMe、键鼠、显示等设备与内核 Shell,使内核能在真实硬件上“自诊断”;最终接入文件系统与用户态,演进为可持续验证的操作系统实验平台。
2、软件功能、核心功能模块
- 引导与内存:init.elf 在 UEFI 阶段完成硬件探测、页表构建与 kernel.elf 加载,内核运行于高半区;实现四级页表、伙伴系统 BCB、空闲页分配器 FPA、kpoolmemmgr 池分配器、地址空间管理与 TLB shootdown。
- 调度与并发:per-CPU 调度器、任务池、内核线程、block_queue 阻塞队列(句柄化登记、出锁后批量唤醒)以及自旋锁/读写锁体系。
- 平台与中断:ACPI 表解析、LAPIC/IOAPIC、AP 多核启动、HPET/TSC/RTC 计时、异常与中断分发框架。
- 设备驱动:PCIe ECAM 枚举、NVMe(SQ/CQ、PRP、读写与完成中断)、DMAR/VT-d、i8042 键鼠、UART 串口、GOP 文本控制台与内嵌字库;NVMe 读写与 VT-d 关闭已真机验证。
- 观测与交互:printk 日志栈、KURD 五层错误模型、panic 取证、内核符号回溯;kshell_v2 将 Shell 核心与前端解耦,30 余条命令可运行在“键盘+屏幕”和“魔法断点+gdb(CI)”两种前端上。
- 规划中:RavenFS 文件系统(用户态原型已完成并通过用例)、用户态与网络通道。
3、业务流程、功能路径描述
启动路径:UEFI → init.elf 枚举 ACPI/PCIe/内存资源 → 建立页表 → 加载 kernel.elf 至高半区 → BSP 初始化内存、中断与调度 → 启动 AP → 探测 NVMe/DMAR/i8042/GOP → 创建内核线程并进入 kshell 会话。
命令路径:按键 → i8042 中断 → 输入事件环 → 前端行编辑 → kshell_v2 分词并在命令红黑树中查找 → 执行处理器把业务日志写入切片 → 前端渲染并归档到会话环;CI 前端只替换输入输出手法,不改动命令逻辑。
存储路径:块请求进入 block_queue 阻塞 → 提交 NVMe SQ → 完成中断 → 消费 CQ → 唤醒等待任务。
1、整体架构和设计思路,不同模块使用的技术栈
两阶段镜像+宏内核模块化:init.elf 在 UEFI 阶段探测硬件、建页表、加载 kernel.elf,kernel.elf 在高半区运行。内核按 arch/memory/scheduler/drivers/log/shell 拆 OBJECT 库,只经显式接口与 KURD 通信;并发以 per-CPU 为边界,GS 存私有数据,跨核走 IPI/RPC。可观测性优先:printk 唯一出口+符号回溯+panic 取证+首爆探针。技术栈:NASM+UEFI、C++23 freestanding、位图/红黑树、汇编上下文切换、MMIO/ECAM、CMake/Ninja、QEMU/KVM+GDB。
2、“我”的负责模块和结果
作为唯一开发者,我负责架构、内核模块与工具链:引导/页表、BCB/FPA/kpoolmemmgr、per-CPU 调度器与 block_queue、PCIe/NVMe/DMAR/i8042、日志与 kshell_v2、CI 与测试工具。结果:13个月 416次提交、约6.1万行;30余条命令;NVMe/VT-d/DMAR 真机验证;18套测试/回放程序;自建 TCG 批量复现与 GDB 魔法断点 CI。
3、“我”遇到的难点、坑,和解决方案
- 真机 NVMe 首笔 DMA 报 Received Master Abort,QEMU不复现。排除 MMIO/ECAM 后怀疑 IOMMU,用 kshell 在线改写 VT-d 使能位,DMA 当场复活,证实固件 Kernel DMA Protection 强制开启;DMAR 驱动收敛为“映射寄存器+关闭 DMA remapping”。
- WRAITH 双调度竞态是第二场硬仗:SMP+TCG 下 NVMe 并行初始化时随机踩坏内核栈,只在宿主负载抖动时现形(空载 0/60,12路负载2/20),同一bug可降级、HANG、PANIC,甚至异常入口自噬成 #PF→#DF 风暴。为抓它,我搭了整套 CI 管线:tcg-trace 批量连跑(SMP6、超时/体积帽、自动分类)+首爆冻结+QEMU vmcore 转储+离线符号化+IRQ-safe 日志环,累计 200余组复现实验;再用逐执行 trace 观测效应过强、忙等 bisect 压没复现率等实验排除死路,并指挥 AI subagent 做两份静态审查,对“谁能写别人栈”火力覆盖式排查,把候选从 A–F 挤到“跨核同栈并发写”:阻塞者“先发布、后切走”、唤醒不看谁在跑、sched 跨核偷取无 owner 校验。修F1–F5(handoff 登记/wake_pending、调度门、锁内快照、退出栈保护)后,同配方 A/Bbug复现率降到0