桜 Sakura Project 桜 · X86_64
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 tickPIT 驱动调度节拍;睡眠类原语的实际唤醒延迟上界也是一个时间片
用户栈64 KiB16 个页帧,映射在用户地址空间
CanFS 块4 KiB 载荷 + 链指针运行时命名空间,按扇区分批落盘
块设备卷FAT16 / FAT32FatFs;每次写后立即 f_sync 并刷到 ATA
块设备槽4当前后端为 RAM disk 与 ATA
显示最高 1920 × 1080VBE 宽优先择优,纯软件三层合成,按损伤局部刷新