进行中
1 项
BSD 组件层的 vm 接入(V1)
让 FreeBSD 的 vm_phys 与 vm_page 接管物理页管理。每 CPU 块已让给 struct pcpu(BSD 组件的 PCPU_GET 硬编译成 %gs:偏移);白名单 380 个上游文件,按「能用上游就不自写」的原则推进;跨接层第一块(内核环境量、控制台、时钟、环境变量)已落地,ABI 由 abi_check.c 按上游头逐个核对。
实测闭包: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 评估。
验证口径
每次改动都得跑完这几步,缺一不可。跳过验证直接说「已完成」不算数。
-
tools/init-devenv.sh
环境自检加 vendor 完整性
-
zig build test
宿主机单元测试
-
tools/start-soke.sh
QEMU/OVMF 无头启动加串口证据断言
-
tools/start-soke.sh --iso
发行侧改动额外跑一次 —— 从安装介质引导,同一套断言逐条比对