版本 0.3.1000.0 preview 版 x86-64(long mode)

Soke

自研宏内核 SNMK,由 BSD 组件层与 SPT 宏内核构成。内核以 Zig 与 FASM 编写,全程 QEMU/OVMF 实测。

技术参数

架构
x86-64(long mode)
ring-0 内核 / ring-3 用户程序
内核
SNMK
SPT 宏内核 + BSD 组件层
语言
Zig + FASM
内核与 HAL 用 Zig,汇编用 FASM,Soke64 API 用 C++
引导
Limine
上游 UEFI 引导器,vendor 接入
BSD 组件
FreeBSD 15.1-RELEASE
作为内核内的组件层接入
授权
专有 / 闭源
见 EULA 与许可证

一次真实的启动

下面是 QEMU/OVMF 无头启动的串口输出节选,原样保留。里面的页数、定时器频率、 CPU 数都是当次实测值,换台机器跑就会变 —— 正因为会变,才说明不是编的。

build/serial.log — QEMU/OVMF 无头启动,串口输出原样保留
[snmk] long mode entry
[snmk] SNMK KNRL_VER=0.3.1000.0 (edition preview)
[snmk] loader: Limine 12.9.0
[snmk] hhdm=0xffff800000000000 memmap=35 usable=115548 pages kernel_img=172 modules=1
[snmk] fb: 1280x800 pitch=5120 bpp=32 8bit/channel masks r=8/16 g=8/8 b=8/0
[snmk] pmm: 115547 pages free
[snmk] heap: bootstrap bump online (256 KiB)
[snmk] vmm: kernel aspace online, cr3=0x000000001bf7c000 hhdm=0xffff800000000000
[snmk] bsd: sysinit=0 modules=0
[snmk] cpu: gdt/idt/tss ready
[snmk] exc: #UD selftest ok
[snmk] lapic: online @ phys=0x00000000fee00000 virt=0xffffff0000000000 id=0
[snmk] syscall: gate armed, lstAr=0xffffffff80001138
[sched] preemptive online
[snmk] lapic: timer calibrated 627045 ticks/10ms (62704kHz)
[snmk] smp: 4 cpu online (bsp_lapic_id=0)
[snmk] initrd: initrd 258560 bytes, 1 module(s)
[snmk] spk: welcome-notes 1.0.0 x64 payload=data.tar.zst files=2
[initd] ring-3 alive, tid=1
[initd] 这条消息来自 ring 3,经 syscall 门与用户内存校验后由内核打印
[snmk] dynlink: objs=3 libs=2 relocs=12
[dynprobe] dynamic link verified

引导流程

从固件到 BSD 组件的交接链。每一环的产物都是下一环的输入, 引导加载器由本项目自研,引导管理器则用上游 Limine。

01
UEFI 固件
上电自检后按 ESP 上的引导项装载引导管理器
02
Limine 引导管理器
上游 UEFI 引导器,vendor 接入,不自研
03
initsoke.efi
自研引导加载器。读 ESP 上的内核与 initrd、解析 ELF64、整块连续装载、建立恒等映射与 HHDM 与内核映像页表、采集内存图与 RSDP 与帧缓冲、退出引导服务,按自研交接 ABI 跳进内核
04
sptkrnl.elf
SNMK 内核映像,进入 long mode 后由冷入口接管
05
BSD 组件
FreeBSD 15.1-RELEASE 源码子集作为内核内的组件层,随内核一同链接

已经跑通的部分

全部 21 项都带实测证据,没有跑通的一律不写进来。

全部 21 项

引导链

UEFI 固件 → Limine 引导管理器 → initsoke.efi 引导加载器 → sptkrnl.elf 内核 → BSD 组件...

内核入口与版本

冷入口设置 CR4 的 OSFXSR/OSXMMEXCPT 并执行 fninit,随后进入 kmain。版本号不在代码里写死,构建期由 version.toml 生成版本模块。

引导事实收编

引导器响应块被收编成内核内部引导事实,HHDM 基址、内存图、可用页数、内核映像大小全部取自运行期而非编译期常量。

帧缓冲(如实记录)

记录引导器给出的 GOP 帧缓冲几何与通道掩码。当前 QEMU/OVMF 给的是 32bpp、每通道 8bit,日志照实写 8bit/channel —— 不把 32bpp 说成 10bit,全链路 10bit 尚未实现。

物理页管理

从引导器内存图建立空闲页栈,内核拿到全部可用物理页。

引导堆

内核早期阶段先上线 bump 分配器,供地基各子系统在真实分配器就位前使用。

桌面视觉

随系统分发的壁纸素材。桌面栈的设计已经定稿 —— 液态玻璃材质、视觉语言、交互动效各有独立规范 —— 但尚未开始实现, 状态见路线图。

读视觉语言规范
当前是预览版,能力边界说清楚

这不是一个能日常使用的系统。内核地基、用户态、动态链接已经跑通并有串口证据, 但驱动模型、文件系统、POSIX 面、桌面栈都还没做 —— 13 项已知缺口全部列在路线图里,包括那些看起来不体面的。