Documentation
构建与源码结构
这里说明怎么把仓库变成可启动的磁盘镜像,以及代码放在哪里。
01 / Build
构建步骤
前置条件
| 项目 | 要求 |
|---|---|
| 宿主系统 | Windows(构建脚本为 PowerShell 5.1) |
| 交叉工具链 | x86_64-elf-gcc / ld / objcopy(脚本会自动探测多处候选路径) |
| 汇编器 | NASM |
| 磁盘工具 | mtools(mformat / mdir),用于构建 FAT 分区卷 |
| 运行环境 | QEMU(x86_64) |
| 可选 | Python 3(UEFI 链的 ELF→PE32+ 转换脚本) |
编译
git clone https://github.com/ikunshare988/sakura-project.git cd sakura-project # BIOS 链 + 内核 + 用户态程序,产出 build\disk.img powershell -NoProfile -ExecutionPolicy Bypass -File build.ps1 # 可选:额外构建 UEFI 加载器 BOOTX64.EFI 并拼进同一个磁盘映像 powershell -NoProfile -ExecutionPolicy Bypass -File build_efi.ps1
脚本会依次编译引导扇区、stage2、内核与用户态程序,测量链接产物确保不会碰到栈顶,
最后拼出 build\disk.img。
运行与门禁
# 带窗口运行,可操作桌面 qemu-system-x86_64 ^ -drive "file=build\disk.img,format=raw,if=ide" ^ -m 256M -vga std -no-reboot # 无头自测:跑内建测试并输出串口日志 qemu-system-x86_64 ^ -drive "file=build\disk.img,format=raw,if=ide" ^ -m 256M -display none -serial file:gate.log -no-reboot # 判定标准:gate.log 结尾应包含 # Results: 0xdb/0xdb passed, 0 failed # [SHELL] desktop ready
注意
QEMU 退出码非 0 不一定是构建问题。内核在关机路径上的行为、以及 panic 后的停机,
都可能让 QEMU 返回非零退出码,判断依据应以串口日志为准。
02 / Layout
源码结构
sakura-project/ ├── build.ps1 整体构建脚本(引导链 / 内核 / 用户态 / 磁盘镜像) ├── build_efi.ps1 UEFI 链构建脚本 ├── run-gate.ps1 无头 QEMU 门禁(串口断言 + ring3 存活判据) ├── make_vmware.ps1 生成可在 VMware 里启动的磁盘映像 ├── AGENTS.md 并行开发约定:构建目录 / 所有权 / 门禁 / 内存不变量 ├── kernel/ │ ├── arch/x86_64/ │ │ ├── boot/ MBR 引导扇区、stage2、上下文切换、中断桩、链接脚本 │ │ └── uefi/ BOOTX64.EFI 加载器 │ ├── include/kernel/ 全部内核头文件 │ └── src/ │ ├── mm/ 物理内存、页表、内核堆 │ ├── sched.c 调度器(类分层 + 虚拟截止时间) │ ├── ipc/ 进程控制块、同步原语 │ ├── syscall/ 系统调用分派与用户进程 │ ├── fs/ FatFs 接入、CanFS 兼容层、procfs │ ├── net/ e1000 / ARP / IPv4 / ICMP / UDP / TCP / DHCP / NTP │ ├── drivers/ 块设备与总线驱动 │ ├── hw/ PCI / ATA / 键盘 / 鼠标 / HPET / RTC │ ├── pm/ ACPI 解析、关机 / 重启 / 睡眠状态机 │ ├── security/ 权限与会话 │ ├── crypto/ 内核侧熵源与 DRBG │ ├── desktop/ 窗口管理、合成器、桌面组件 │ ├── apps/ 内置 GUI 应用(当前仍在 ring0) │ ├── gui/ 控件与布局 │ └── pkg/ .ospkg 包管理器 ├── userspace/ │ ├── libshittim/ 最小 libc + 窗口 API + ring3 绘制基础(<gfx.h>) │ └── programs/ browser / calculator / cryptotest / editor / explorer / │ filemanager / imageviewer / init / settings / shell / │ socktest / sysstorm / test ├── legacy/canfs/ CanFS 历史实现(运行时在 kernel/src/fs 的兼容层里) ├── specs/ 设计规格文档与审计报告 ├── themes/ TOML 主题 ├── website/ 本官网(静态站 + 发布流水线脚本) └── third_party/ 外部组件(含许可证与来源登记)
03 / Process
规格先行的开发方式
功能不是直接写代码写出来的。每项能力先落成一篇设计规格,再实现,最后用门禁验收。
① 写规格
每篇规格包含五段固定结构:目标、现状、方案、验收标准、回归影响。写不清楚就说明还没想清楚。
② 实现
按规格实现,改动范围由规格界定,避免顺手重构把风险扩散到无关模块。
③ 门禁
内建测试程序在无头 QEMU 里跑一遍,全部断言通过并确认桌面就绪,才算完成。
04 / Licensing
第三方组件声明
内核核心(引导、调度、内存、中断、进程、文件系统核心、网络核心)全部自研,不引入外部实现。 仅在「非内核核心且实现复杂」的外围组件上允许引入宽松许可代码,且逐项登记。
| 组件 | 用途 | 许可证 |
|---|---|---|
| stb_truetype | 字体光栅化:内核 font_engine.c 与 ring3 libshittim/text.c 同源实现,两侧输出由校验和证明逐像素一致 |
MIT / 公共领域双授权 |
| stb_image v2.30 | PNG / JPEG / BMP / TGA 解码:内核图片查看器与 ring3 同源移植 | MIT / 公共领域双授权 |
| Hack 字体 | 内嵌等宽字体子集(覆盖基本拉丁与拉丁补充区) | MIT(Source Foundry 字形)+ Bitstream Vera License(派生轮廓,保留字体名 Bitstream / Vera)+ 公有领域(DejaVu) |
| GNU Unifont 18.0.01 | 构建期派生的 16×16 CJK 字形池(userspace/assets/cjk16.raw);仅产物入库,字体本身不随镜像分发 |
SIL Open Font License 1.1 |
| FatFs R0.16 | FAT16 / FAT32 文件系统核心,/apps 与 /home 卷的实际读写实现 |
单条款 BSD 风格(Copyright (C) 2025, ChaN) |
| libwapcaplet | WAP / WML 词法分析与解析 | MIT(NetSurf Browser Project) |
| libparserutils | 字符集编解码、输入流、动态数组 | MIT(J-M Bell) |
| libhubbub | HTML5 解析器(词法 + 树构建) | MIT(J-M Bell 及贡献者) |
| libdom | DOM Core / HTML DOM / DOM Events | MIT(J-M Bell 及贡献者) |
| libcss | CSS 解析、选择器匹配与层叠 | MIT(J-M Bell 及贡献者) |
| plutovg | 抗锯齿二维矢量绘制 / SVG 光栅化 | MIT |
仓库内 third_party/ 目录保留各组件的原始许可证文本
(third_party/<组件>/LICENSE*);未 vendor 上游源码、
只发构建期派生物的组件,其许可证另存于
third_party/licenses/。
每一项的来源 URL、版本或 commit、SHA-256 与改动点都登记在
third_party/README,那是本清单的真相源。
引入策略:内核核心不引入外部实现;仅在非核心且实现复杂处允许宽松许可代码,
且不接受 GPL / LGPL 等传染性许可。任何新增组件都需单独确认后再入库。
05 / Cheatsheet
关键数字速查
| 项目 | 取值 | 说明 |
|---|---|---|
| 页大小 | 4 KiB | 物理内存位图以 1 bit / 页管理,位图覆盖低 2 GiB |
| 内核堆 | 64 MiB 固定 | 显式空闲链表,暂不支持按需增长;基址固定以避开用户虚拟地址带 |
| 进程表 | 16 槽 | PCB 字段偏移与汇编上下文切换以静态断言钉死 |
| 时间片 | 10 tick | PIT 驱动调度节拍;睡眠类原语的实际唤醒延迟上界也是一个时间片 |
| 用户栈 | 64 KiB | 16 个页帧,映射在用户地址空间 |
| CanFS 块 | 4 KiB 载荷 + 链指针 | 运行时命名空间,按扇区分批落盘 |
| 块设备卷 | FAT16 / FAT32 | FatFs;每次写后立即 f_sync 并刷到 ATA |
| 块设备槽 | 4 | 当前后端为 RAM disk 与 ATA |
| 显示 | 最高 1920 × 1080 | VBE 宽优先择优,纯软件三层合成,按损伤局部刷新 |