路线图

这份路线图记录的是状态而不是愿景。判断口径只有一条:跑过没有。 跑到哪一步就写哪一步,没跑的写「未开始」,跑了一半的把缺什么列清楚。

进行中

1 项

BSD 组件层的 vm 接入(V1)

让 FreeBSD 的 vm_phys 与 vm_page 接管物理页管理。每 CPU 块已让给 struct pcpu(BSD 组件的 PCPU_GET 硬编译成 %gs:偏移);白名单 380 个上游文件,按「能用上游就不自写」的原则推进;跨接层第一块(内核环境量、控制台、时钟、环境变量)已落地,ABI 由 abi_check.c 按上游头逐个核对。

third_party/freebsd/DEPENDENCIES.md

实测闭包:vm_page.o 与 vm_phys.o 触及 47 个库成员、库内互解 358 个符号,仍需外部提供 218 个 —— 内核环境 129、pmap 32(自研 VMM)、调度钩子 18(自研调度器桥接)、sysctl 15、线程与 PC 数据 13、vm 内部 6、锁 2、打印断言 2、malloc 类型 1。

已知缺口

当前实现里确实还没有的东西,以及其中几处踩过的坑。这一节不粉饰。

13 项

AP 不参与调度

AP 上线后停在 hlt,任务只在 BSP 上跑。真 SMP 调度(每核运行队列 + 负载均衡)未做。

BootFacts.cpus 尚未填充

引导事实里这一项还是空切片,CPU 数要从引导器 MP 响应取。踩过一次坑 —— 按空切片算 @intCast(0 - 1) 直接触发 ReleaseSafe 安全停机。

logd 还没有输入面

IPC 域未落地,服务之间无法递消息;logd 目前只自证「被调度」。

无按需分页与 COW

用户页在装载时一次映射完,fork 克隆未做。

无 sleep 与 wait

CLOCK_SLEEP 编号已定但未实现,服务只能忙等或让出。

用户栈地址固定

所有进程共用同一个 USER_STACK_TOP 虚拟地址。各自地址空间内不冲突,但无法做多栈布局。

共享库没有跨进程复用

每个进程各自把 .so 重新读进物理页,无页缓存、无引用计数、无共享映射 —— 同一个库被 10 个进程用时占 10 份内存。装载器语义(dlopen 与 RTLD_*)也没有。

库的构造器不执行

只有可执行文件自己的 .init_array 会被 crt 遍历。.so 里的构造器需要有初始化表桥接 —— QPA 插件这类组件恰好靠它自注册。当前两个自检库都没有构造器,这一环尚未暴露。

无 TLS

用户态不做线程局部存储(%fs 基址未设),带 TLS 的第三方代码目前编不过也用不了。

陷阱路径的归属未定

上游 BSD 子系统是配套的一整套,把 kern_tc.c 与 kern_umtx.c 拉进链接就会连带要平台层的汇编向量入口与 machdep.c 的符号;而陷阱、引导、调度路径是本内核自己的 FASM 桩。两套所有权重叠,继续深入之前必须定谁提供上游要的入口。

重定位类型只覆盖四类

R_X86_64_COPY(非 PIC 访问外部数据会产生)尚未实现,遇到会以未支持类型拒绝装载 —— 这是有意的,静默跳过会变成远处的随机崩溃。

全量立即绑定

链接侧是 BIND_NOW,没有延迟绑定;.rela.plt 在装载期一次解完。

vendor-qt6.sh 收尾有缺陷

四个模块下载并核对完之后,写 VERSION 的那一步以「f: 未找到命令」中断。源码本身已落地、校验值已算出,只是锚点文件没写成 —— 锚点已按落盘记录补齐并与现存源码树核对一致,脚本本身的缺陷留到下次抽 vendor 时定位。

计划中

下面这些一行都还没写。列出来是为了交代推进顺序与依赖关系, 不是进度汇报 —— 依赖顺序比先写哪个页面重要得多。

内核补齐

V1 跨接层

panic/kassert、malloc/free 接内核堆、sysctl 最小面、sched 钩子、单 VM domain,随后 vm_page 加页队列与 vm_phys 编入内核接管物理页分配。

V2 vm_map 与 vm_object

接入后 pmap 角色由自研 VMM 承担。

V3 UMA 分配器

用真实分配器替换引导期 bump 堆。

IPC 与能力

IPC 域(call/reply/subscribe)与能力域(grant/revoke/dup),服务间通信的地基。

进程模型补齐

PID 表、fd 表、失败回收、COW 克隆、按需分页。

驱动层

内核设备模型(ring-0,Zig)、PCI/PCIe 枚举、块设备与输入与显示驱动。

VFS 与存储

Btrfs 系统根、tmpfs、FAT32。

POSIX 面

posixd 承担 fork/exec/信号与 /proc。

用户态与桌面

Qt6 移植

上游四个模块(qtbase、qtdeclarative、qtsvg、qtshadertools,79114 个文件)已落地并逐个核对来源,但离能编还远 —— Qt6 依赖 libc/libm/pthread/dlopen、C++ 标准库(含异常与 RTTI)、TLS、POSIX 文件与内存接口。依赖顺序上的下一步是 TLS 与 libc/POSIX 地基。

Soke64 API 补齐

随各域 syscall 落地扩面(IPC、能力、内存、文件)。

桌面前置能力

动态链接已落地;共享内存对象、IPC 与能力、fence 与事件同步、POSIX 事件面、DMA 池、显示驱动程序模型、输入设备驱动、10bit 全链、VFS 与 spe、用户会话仍待做。

桌面栈

骨架已就位但未接通。desktop/src/ 下 inputd、Soke Display Server、compositord、wmshell、Soke Display Manager、qpa-plugin、Soke Display Driver Model 各自有职责与依赖说明。

10.7 亿色

全链路 10bit,禁调色板与 VGA 与 VBE。当前 QEMU/OVMF 给 32bpp,日志如实记 8bit/通道。

发行侧

spe 包管理器

格式已经能读(内核解析器加宿主工具),但安装要等 VFS —— 一个不能安装的 spe 只是玩具,不写。签名与依赖解析同理,先有可信密钥分发与摘要实现。

仓库与事务安装

.spk 的索引、依赖求解、失败回滚。

真机线

硬件支持

ACPI 全量、NVMe/AHCI、xHCI、IOMMU、厂商 GPU ICD、Wi-Fi 评估。

验证口径

每次改动都得跑完这几步,缺一不可。跳过验证直接说「已完成」不算数。

  1. tools/init-devenv.sh

    环境自检加 vendor 完整性

  2. zig build test

    宿主机单元测试

  3. tools/start-soke.sh

    QEMU/OVMF 无头启动加串口证据断言

  4. tools/start-soke.sh --iso

    发行侧改动额外跑一次 —— 从安装介质引导,同一套断言逐条比对