Yo-yo-ooo/SkylineSystem
Yo-yo-ooo/SkylineSystem has 34 GitHub stars and 1 forks. GitHot measured 0 stars in 24 hours. Last checked 2026-11-14 20:04 UTC. Last push 2026-11-13.
Measured star growth
- in 24h
- 0
- in 7 days
- Collecting history
- in 15 days
- Collecting history
- in 1 month
- Collecting history
Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.
About
a modern operating system (just support x86_64,aarch64)
Creative & MediaREADME.md
Original /$$$$$$ /$$ /$$ /$$ /$$$$$$ /$$
/$$__ $$| $$ | $$|__/ /$$__ $$ | $$
| $$ \__/| $$ /$$ /$$ /$$| $$ /$$ /$$$$$$$ /$$$$$$ | $$ \__/ /$$ /$$ /$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$/$$$$
| $$$$$$ | $$ /$$/| $$ | $$| $$| $$| $$__ $$ /$$__ $$| $$$$$$ | $$ | $$ /$$_____/|_ $$_/ /$$__ $$| $$_ $$_ $$
\____ $$| $$$$$$/ | $$ | $$| $$| $$| $$ \ $$| $$$$$$$$ \____ $$| $$ | $$| $$$$$$ | $$ | $$$$$$$$| $$ \ $$ \ $$
/$$ \ $$| $$_ $$ | $$ | $$| $$| $$| $$ | $$| $$_____/ /$$ \ $$| $$ | $$ \____ $$ | $$ /$$| $$_____/| $$ | $$ | $$
| $$$$$$/| $$ \ $$| $$$$$$$| $$| $$| $$ | $$| $$$$$$$| $$$$$$/| $$$$$$$ /$$$$$$$/ | $$$$/| $$$$$$$| $$ | $$ | $$
\______/ |__/ \__/ \____ $$|__/|__/|__/ |__/ \_______/ \______/ \____ $$|_______/ \___/ \_______/|__/ |__/ |__/
/$$ | $$ /$$ | $$
| $$$$$$/ | $$$$$$/
\______/ \______/
An x86_64 SMP hobby OS with a CPU-parallel software compositor,
a working window manager, and a private-contract, fully modularized kernel.
Runs in QEMU (tested with 512 MB – 2 GB guest RAM).
SkylineSystem 是一个面向 x86_64 SMP 的 hobby 操作系统:不是 Linux 发行版,也不追求 POSIX/Linux ABI。 它在一个架构上追求深度——自研调度器/虚拟内存/系统调用边界/合成器/ 窗口管理器,并在此基础上实现了私有契约型可加载内核模块(kmod)与全内核组件化: Tier 0 固定核心之外,驱动、文件系统、网络栈、平台组件与 syscall 实现全部是受同一套 拓扑/能力/事务/生命周期治理的组件(内建静态链接,可被
.ko接管/热替换)。
English TL;DR — SkylineSystem is a hobby x86_64 SMP OS (not a Linux distribution, not POSIX) with an original deadline-based scheduler, a CPU-parallel software compositor + window manager, 4-level paging/CoW, ext4/lwIP/network stacks, and a private-contract loadable-kernel-module system: the Tier 0 core is fixed, while 37 built-in components and 15
.kodemos share one topology / capability / transactional-load / hot-replace model. Build withmake cm, run it in QEMU — see §5.
[!CAUTION] 仅在 QEMU 中测试,不要在真机上运行(仍处于开发/测试阶段)。
1. 三层内核架构
内核由三层组成,三者共享同一套组件线格式、拓扑图、能力策略与生命周期治理:
| 层级 | 内容 | 链接方式 | 说明 |
|---|---|---|---|
| Tier 0 | 启动、GDT/IDT/中断、页表、上下文切换、调度器核心、syscall 入口、模块加载器/治理、能力注册表、klib、内存机制 | 固定,不可模块化 | 系统的可信基座(TCB),见 §1.1 |
| Tier 1 | 平台/时间/SMP、调度策略、分配策略、设备/PCI、全部驱动、VFS/ext4/FAT/rootfs、lwIP、framebuffer、syscall 实现家族、user.init | 内建组件:静态链接进内核镜像,但使用与 .ko 完全相同的 manifest/.in/.out 线格式、拓扑、能力与生命周期;可被 .ko 热替换 |
共 37 个内建组件,源码全部位于 kernel/modules/builtin/ |
| Tier 2 | 外部可加载实现/扩展/诊断 | 运行时 ET_REL 加载 | 15 个演示 .ko 随 ISO 下发,见 §4 |
一句话概括:统一边界(syscall/加载器/治理),放开实现(组件私有契约),管住回滚(事务化加载与热替换)。
1.1 模块线格式与治理机制
- 线格式:
.ko/ 内建组件均声明.in({provider 组件名 + 符号 + 私有契约 + 回填地址槽 + ABI 区间})、.out(函数/数据/私有契约 ops/座位/syscall 实现)与.kmod_manifest(256B 清单: 名称/版本/Tier/flags/能力/生命周期回调/预算)。 - ET_REL 加载器:只接受白名单重定位集(
R_X86_64_64/PC32/PLT32/32/32S), 对段边界/对齐/manifest/字符串/导入槽做严格校验,未知类型整体拒绝。 - 统一拓扑图:Kahn 排序 + 依赖环检测,启动时按 provider 先序初始化; 缺失依赖/环形依赖使整个加载事务失败而非静默乱序。
- 能力策略:
STRICT(默认,仅内置可信清单,能力 = 清单∩声明)/OPEN/DISABLED;KMOD_CAP_RESERVED_CORE等 Tier0 保留位对任何.ko声明即拒绝。 - 事务化:加载→回填→注册→init 全成功或逆序全回滚;init 失败不残留半加载模块。
- 热替换:quiesce 协作式静默 → epoch 排空 → 看门狗预算 → 原子切换新镜像;
任一步失败自动回退旧版本(含内建组件被
.ko接管后的回退)。 - 卸载:引用计数硬门禁(有消费者时
EBUSY),卸载后导入边/座位/导出自动撤回。 - 固定 syscall 边界:0..63 固定契约槽(参数/返回/错误码/语义固定;可替换的是实现),
128..511 动态命名空间;入口表使用治理哨兵,未注册槽返回
ENOSYS。 - 座位(Seat):开放策略、不开放机制。已落地
kernel.seat.random.v1(随机源)、kernel.seat.sched.policy.v1(调度策略)、kernel.seat.alloc.policy.v1(分配策略, large-alloc/OOM 冷路径),默认实现与旧行为逐位等价。 - Tier0 共享服务:klib 公共工具以两种方式共享给每个模块:
① C 链接函数(
strlen/strcmp/snprintf_/hashmap_*/art_*/spinlock_*、kcalloc/krealloc/ kmalloc_aligned等)作为.kout直接导出符号,.ko直接调用即可由加载器解析; ② 版本化 ops 契约kernel.klib.v1、kernel.sync.v1、kernel.algo.v1,带 contract/ABI/结构尺寸强校验。当前内核共 57 项导出。
1.2 组件化范围(Tier 1,37 个内建组件)
| 类别 | 组件 |
|---|---|
| 平台/时间 | kernel.arch.acpi、arch.apic、arch.irq、arch.smp、time.pit、time.hpet、time.rtc、fs.cache |
| 调度/分配 | kernel.sched.core、sched.install、sched.policy.eevdf(策略座位)、alloc.policy(分配座位) |
| 设备/PCI/块 | kernel.dev.core、pci.core、pci.enumerate、block.core |
| 驱动 | driver.ahci、nvme、xhci、e1000、input.ps2.kbd、input.ps2.mouse |
| 文件系统 | fs.vfs、fs.ext4(lwext4)、fs.fatfs、fs.rootfs |
| 网络 | net.netdev(设备注册表)、net.lwip(协议栈 deferred 线程) |
| 显示/用户态 | display.fb、user.init(desktop/hw 进程创建) |
| syscall 实现 | syscall.{file,proc,mem,info,time,dev,random}(27 个固定槽注册;入口/语义固定) |
1.3 启动流程(拓扑驱动)
[Tier 0] cli → Serial → SSE/GDT/IDT/FPU → PMM → VMM → SLAB/SLUB
→ SIMD → SMEP/SMAP → syscall_init(固定入口/治理哨兵)→ KmodInit
↓
[Tier 1] KmodBootComponents:扫描 .kbuiltin.desc → Kahn 拓扑排序 → bind/apply/init
(ACPI→APIC→PIT/HPET/RTC→SMP→sched→PCI→驱动→VFS/ext4→rootfs
→fb→sched.install→syscall 家族→net/display/user.init)
↓
[Tier 2] KmodBootIngest(登记 ISO 内全部 .ko)→ KmodBootLoad(KMOD_MF_BOOT 模块)
↓
sti 前单线程 KMOD_SELFTEST(12 个用例,含加载/回滚/热替换/座位/共享服务)
↓
sti + SCHED_VEC IPI → 调度器接管 → 桌面/DOOM/lwIP
串口实测片段:
[kmod] builtin components: 37 declared
[kmod] builtin graph: 37 component(s) ready (topo order)
[kmod] kernel exports: 57 symbol(s) published
[kmod] boot load: 2 requested, 2 ready, 0 failed
KMOD_SELFTEST PASS 12/12
[user.init] desktop PROCESS: 6
2. 目录结构
SkylineSystem/
├── kernel/
│ ├── src/ # 仅 Tier 0 固定核心
│ │ ├── arch/<arch>/ # start/init、interrupt、vmm、cpu、simd、
│ │ │ # schedule 核心 + syscall 入口、kmod 加载/治理/服务
│ │ ├── mem/ # PMM / SLAB / SLUB / heap 机制
│ │ ├── klib/ # kprintf/serial/stallwatch/字符串/ART/hashmap/…
│ │ ├── elf/ flanterm/ print/
│ │ └── main.cpp
│ ├── modules/ # 全部组件实现(全模块化重构后)
│ │ ├── builtin/common/ # acpi / drivers / fs / net / partition / smbios
│ │ ├── builtin/x86_64/ # components/(37 个组件壳,按 13 类分子目录)、
│ │ │ # dev / drivers / lapic / ioapic / pit / rtc / smp / syscall
│ │ └── loadable/ # 15 个可加载 .ko 演示源码
│ ├── include/kmod/ # ABI / manifest / 组件宏 / 契约 / 共享服务头
│ ├── bin-x86_64/ # 构建产物:kernel + modules/*.ko
│ └── Makefile # 模块树递归发现 + .ko 独立构建
├── programs/ # 用户态:desktop(WM+合成器)、helloworld、PureDOOM…
├── lib/ # 用户态 libc / 图形库
├── ablib/ # 高频 libc 原语(memops/AVX 分发)+ freestanding 头
├── tests/ # 宿主测试套件(含 tests/kmod 模块/组件门禁)
├── docs/ # 设计文档(见 §6)
├── res/ # limine.conf、SAF 打包、QEMU/测试脚本
├── limine-protocol/ limine-binary/ # 引导协议与预编译 Limine
├── disk.img # 用户程序 ext4 镜像(desktop/DOOM 等)
└── Makefile # 顶层构建:ISO / HDD / run / clean / cm
全模块化约定:
kernel/src只允许放 Tier 0;新增组件实现放到kernel/modules/builtin/{common,<arch>}/,并在components/下增加一个KCOMPONENT_BEGIN/END壳。头文件暂集中kernel/include(组件私有头下沉到 modules 树是后续路线图项)。
3. 核心特性
3.1 调度器:EEVDF + RIP 反馈(如实描述)
每 CPU 一棵按虚拟 deadline 组织的红黑树(min_vruntime_subtree 增强 + 预取提示),
加权时间片、动态基础 quantum 与 SMP push/steal 负载均衡。在此之上,RIP 反馈在
定时器 tick 间采样线程 RIP 进度,经 Q10 定点双通道 EWMA(死区 + 滞回)得到快/慢乘子,
用于拉长或缩短抢占 quantum——忙等线程被更频繁打断,有进展线程获得更长连续运行。
它不改变 CPU 份额:反馈不进入 Pick(),vruntime 按真实流逝时间计费,虚拟 deadline
是 vruntime + const。所以它塑造的是中断延迟,不是公平份额;目前也没有量化基准,
sched_bench 只验证 EWMA 收敛。详见 docs/scheduler.md。
3.2 GUI:CPU 并行软件合成器 + 窗口管理器
- N 条带、N−1 个 worker:主线程渲染条带 0,其余每 CPU 一个 worker 并绑定内核; 全部渲染到离屏 back buffer,只有主线程提交扫描输出。
- 双缓冲单提交点、脏矩形比较后 blit:静态场景除光标外零扫描输出写入。
- 分层链表:每窗口每条带一次裁剪判断,逐扫描线 blit;每帧 O(条带数 × 窗口数)。
- WM 拥有窗口装饰:SDF 抗锯齿圆角、方向性软阴影、拖动、最大化、最小化、
8 方向缩放;关闭按钮经
sys_kill真正终止客户端进程。 - z-order / 焦点管理:栈序统一为组件层
z;点击窗口、任务栏 restore/raise 立即置顶并在同一帧把键盘焦点交给该客户端;最小化/关闭焦点窗口立即回退到 最高可见窗口;隐藏窗口不参与命中测试。最小化保存先态,恢复保持最大化 (pre_minimized_max/ consolewm_prior)。 - 子进程退出事件:内核在
FinalizeProcExit/DeleteProc把{pid, code}推入 父进程 ring,桌面每帧通过 syscall 31child_event立即回收窗口;不再依赖 500mssys_kill(pid,0)轮询(仅保留 2s 兜底)。 - 64MB 低内存模式:
<80MiB时自动启动 Console + DOOM,Notepad/Settings 延迟(Ctrl+Alt+N/S 可按需拉起),把 56MiB 优先给 DOOM;Ctrl+Alt+D始终可 raise/restore/spawn DOOM。PureDOOM zone 按内存分档(DOOM_TINY 下 ≤80MiB 为 8MiB)并 在 64MB QEMU 下验证可 init/持续渲染。完整说明与 QEMU 证据见 docs/desktop-features.md。 - DOOM_TINY 极限压缩:帧缓冲别名 + 去 RGBA 副本,固定 buffer 由 640KiB
降到 65KiB(省 575KiB);WAD trim 删除音频 lump
11,159,840 → 9,071,551 B;ADPCM-XQ 思路的 IMA-ADPCM 工具 3.93:1。 详见 docs/doom-extreme.md。 - 键盘兜底入口:
Ctrl+Alt+C/M/H聚焦 Console、切换最大化、最小化焦点窗口;Ctrl+Alt+D拉起 DOOM。
已知边界:56MiB 可用内存下 DOOM 与 Notepad/Settings 同时常驻会触发 PMM OOM;低内存模式优先 DOOM,桌面应用延迟/独立启动。详见 docs/desktop-features.md 与 docs/gui.md。
- 独立光标层:O(16²) 直写扫描输出,移动鼠标不触发整帧重组。
- 文本:in-tree TTF 光栅器(基于 stb_truetype,LRU+哈希 glyph 缓存,CJK 排版) 与 flanterm 控制台渲染器(均为第三方组件)。
3.3 内存与安全
- VMM:4 级页表(5 级代码路径存在但编译关闭)、1 GB / 2 MB 大页、写时复制 (2 MB CoW 整页复制;1 GB 页可分裂到 2 MB)、VMA、批量 TLB shootdown、W^X。
- PMM:位图帧分配器 + 每 CPU 页缓存;内核堆 SLUB/SLAB(每 CPU magazine + 双重释放检测)。
- 用户态分配器:epoch-QSBR 延迟回收。
- 加固:bootloader 提供 KASLR slide、SMEP、SMAP、EFER.NXE、独立地址空间、 引用计数共享内存授权、用户态 W^X。
3.4 I/O、文件系统与网络
- 驱动:PS/2 键鼠、framebuffer、AHCI、NVMe、USB(xHCI + MSC/HID)、e1000(82574L)。
- 文件系统:VFS + SAF + lwext4(ext4);FAT 目前仅部分接线;ATA/ATAPI 为未注册死代码。
- 网络:e1000 + lwIP 已接线:DHCP、ICMP ping、UDP/TCP 收发(QEMU slirp); 见 docs/network.md。
- 用户态:自有 libc/
printf、ELF 加载器、线程 + TLS、共享内存;programs/内 自带桌面、终端、PureDOOM 等。
3.5 工具链与构建
- Freestanding C/C++,Clang target
x86_64-unknown-none+ld.lld;传统 Makefile。 - 内核使用
-Wall -Wextra;用户态lib/使用-Wall -Wextra -Werror。 - 单一 Limine 镜像(BIOS + UEFI),同时可生成 HDD 镜像;
.ko由独立modules目标构建, 默认不进入内核链接。
3.6 桌面内嵌 Lua:脚本绘制壁纸 + 可编程窗口样式
桌面(programs/desktop)内嵌 Lua 5.4.7(programs/desktop/lua/,上游零 patch),
启动时执行 /mp/desktop.lua(缺失时用内嵌兜底脚本)。壁纸 framebuffer 直接交给
脚本绘制(C++ 只提供 wallpaper FrameBuffer 变量与像素原语,不解析渐变/颜色配置);窗口 chrome
通过 sky.set_window_style 配置。只开放纯计算库与这块壁纸位图,不开放 io/os/package:
-- 脚本直接拿到壁纸 FrameBuffer 变量 wallpaper(sky.wallpaper 同对象)
local fb = wallpaper
local w, h = fb.width, fb.height
local top, bottom = 0x102040, 0x7A2F6E
-- ... 每行算插值,然后:
fb.hline(0, y, w, (r << 16) | (g << 8) | b)
-- 窗口样式
sky.set_window_style{
corner_radius = 16,
title_color = 0x232A45,
border_color = 0x7A88C8,
ink_color = 0xFFFFFF,
shadow_alpha = 55,
}
- 预置变量
wallpaper:addr/addr_u64、width/height、pitch_pixels/pitch_bytes/ stride、bpp/format,以及fill/pixel/hline/vline/rect/size方法 (sky.wallpaper指向同一 table;sky.wallpaper_*函数形式也保留); - 窗口 chrome 的标题栏/边框/纸面/标题文字/关闭字形/圆角/软阴影从
programs/desktop/sky_style.*的运行期配置读取,默认值与旧桌面一致; - 脚本错误只回退默认主题并通过串口报告,不阻断桌面;
- 标准 C 依赖(setjmp/longjmp、locale、time、math/stdio/string 扩展)已在
lib/stdc/补齐并由tests/stdc/覆盖; - QEMU 无头验证:串口标记 + 截图像素采样,见
docs/lua-desktop.md 与
res/scripts/test/lua_desktop_smoke.ps1。
3.7 Setup 安装整个 OS、Settings 与 Notepad 文件对话框
- Setup(
programs/installer/,UI 标题 SkylineSystem Setup):在保留旧 6 个主题/配置资源安装的同时,读取构建期生成的/mp/os.pkg(SKYOS1容器 + 64KiB LZ4 block),递归mkdir(syscall 22)并流式解压 安装到/mp/system:kernel、15 个.ko、Limine 配置/引导文件、libsky、 desktop/notepad/settings/installer/doom 等程序以及 desktop.lua;写/mp/system/os.manifest。首启由 Settings 提示 +I/ Ctrl+Alt+I 拉起; - 构建:
make os-pkg(生成programs/bin/os.pkg并 e2cp 到disk.img:/os.pkg;cm/ma在 kernel/programs 后自动调用); - Settings(
programs/settings/):启动时自动打开(2G 内存档),读取/mp/themes.index列出主题;Enter 通过 WM 命令邮箱让桌面立即加载选中.lua(重绘壁纸与所有窗口 chrome),R 重载/mp/desktop.lua,I 打开 Setup; - Notepad 增加 Ctrl+O Open 文件对话框(读
/mp/files.index)、 Ctrl+W Close 对话框(Save and Close / Discard / Cancel)、Ctrl+S 保存; - 开始菜单(任务栏最左侧按钮 / Ctrl+Alt+B):WM 自绘的最高 z 层 overlay,列出 Explorer / Notepad / Settings / Setup / DOOM / Console / About; 鼠标点击或 Up/Down/Enter/Esc 键盘导航,点击外部关闭;菜单打开时键盘焦点 钉在 WM 自己的 reader slot,Esc 不会误关当前应用;
- Explorer 文件浏览器(
programs/explorer/,Ctrl+Alt+E 或菜单首项): 通过新增固定 syscall 23readdir真实枚举 ext4 目录(不再依赖静态files.index),支持进入目录、返回上级、刷新、文本/二进制预览、文件大小; 旧内核(槽 23 仍 reserved)自动降级到/mp/files.index; - 桌面全局快捷键:Ctrl+Alt+B 开始菜单、Ctrl+Alt+E Explorer、 Ctrl+Alt+S Settings、Ctrl+Alt+N Notepad、Ctrl+Alt+I Setup、 Ctrl+Alt+D DOOM、Ctrl+Alt+C/M/H 窗口键盘兜底;
- 详见 docs/desktop-features.md,QEMU 自动验证脚本:
res/scripts/test/desktop_features_smoke.ps1、res/scripts/test/setup_os_smoke.ps1、res/scripts/test/doom_compact_smoke.ps1、res/scripts/test/start_explorer_smoke.py。
4. 可加载模块(Tier 2)演示
kernel/modules/loadable/ 下 15 个 .ko 演示,随 ISO 下发到 boot():/boot/modules/:
| 模块族 | 演示内容 |
|---|---|
vendor.demo.hello / greeter |
模块级依赖 + 私有契约:greeter 导入 hello 的导出函数,拓扑先序加载 |
vendor.demo.prng / seat |
随机源座位提供者:加载接管 sys_getrandom,失败/卸载回退 Tier0 |
vendor.demo.sched |
调度策略座位:kernel.seat.sched.policy.v1 的 v1→v2 原子热替换 |
vendor.demo.alloc |
分配策略座位:large-alloc 阈值/OOM 决策冷路径策略热替换 |
vendor.demo.syscall |
动态 syscall 槽注册 + 固定探针槽实现覆写,热替换与卸载清除 |
vendor.demo.klib |
Tier0 共享服务消费者:直接符号(strlen/strcmp/snprintf_)+ kernel.klib.v1/kernel.sync.v1 ops |
badinit / badcap / cycle_a/b |
负向:init 失败事务回滚、能力拒绝、依赖环拒绝 |
模块作者最小示例:
#include <kmod/kmod_module.h>
KMOD_IMPORT_FN(kprintf_, int, (const char *, ...), "kernel", "kprintf_", "kernel.log.v1");
KMOD_IMPORT_KLIB(klib); /* 或直接 extern "C" 调用 strlen/snprintf_ 等直接符号 */
static int32_t my_init(void)
{
char buf[32];
klib->snprintf_(buf, sizeof(buf), "strlen=%u", (unsigned)klib->strlen("x"));
kprintf_("hello .ko: %s\n", buf);
return KMOD_OK;
}
static void my_exit(void) {}
KMOD_EXPORT_FN(my_fn, "vendor.me.v1", 1);
KMOD_MANIFEST("vendor.demo.me", "1.0.0", KMOD_TIER_IMPL,
KMOD_MF_BOOT | KMOD_MF_UNLOADABLE, KMOD_CAP_LOG,
my_init, my_exit);
构建:make -C kernel modules;契约/重定位自检:make -C kernel modules-check。
ABI、加载器、拓扑、治理、热替换、座位与共享服务的完整设计见
docs/kernel-modules.md,组件清单与迁移状态见
docs/kernel-components.md。
5. 快速开始
5.1 环境(Ubuntu / WSL Ubuntu-24.04)
sudo apt-get update
sudo apt-get install -y git make curl clang lld nasm xorriso \
qemu-system-x86 qemu-utils e2fsprogs mtools e2tools dos2unix
只需 x86_64 宿主;内核默认工具链为
clang/clang++/ld.lld(可在命令行覆盖KCC=/KCXX=/KLD=)。首次构建会通过kernel/get-deps与 Limine 下载脚本拉取第三方源码/预编译引导器。
5.2 构建
# 完整构建(清理 + 依赖 + SAF 用户态 + disk.img + 内核 + .ko + ISO)
make cm
# 或增量构建(内核 + .ko + ISO,复用已生成的 disk.img/programs.saf)
make SkylineSystem-x86_64.iso -j4
# 只构建/检查 .ko
make -C kernel modules-check # 15/15 [OK]
产物:
SkylineSystem-x86_64.iso— BIOS + UEFI 可引导 ISO(内核 +.ko+programs.saf)SkylineSystem-x86_64.hdd— 可选 HDD 镜像:make all-hddkernel/bin-x86_64/modules/*.ko— 15 个可加载模块disk.img— 用户程序 ext4 镜像(desktop/DOOM 等);已存在时make cm不会重建, 需要全新文件系统请手动删除。
[!NOTE] 直接
cd kernel && make时必须显式传SS_BUILD_DIR:cd kernel && make SS_BUILD_DIR="$(cd .. && pwd)"(顶层 Makefile 会自动处理)。
内建组件与 .ko 的完整构建流程(源文件发现、KCOMPONENT_*/KMOD_* 宏生成的段、
链接器 KEEP/导出表、启动期拓扑构图、新增组件步骤、常见构建错误)见
docs/kernel-build.md。
5.3 运行
# UEFI(自动下载 OVMF);默认 QEMU 参数 -m 2G -smp 4,可加 QEMUFLAGS="-m 4G -smp 8"
make run
# BIOS
make run-bios
# 或手动运行(含用户程序磁盘与 slirp 网络)
qemu-system-x86_64 -machine q35 -cpu max -m 2G -smp 4 \
-cdrom SkylineSystem-x86_64.iso \
-serial stdio -net nic -net user \
-drive file=disk.img,if=none,id=drive0,format=raw \
-device ide-hd,drive=drive0,bus=ide.0
Windows 侧可直接使用 res/scripts/0run-x86_64.bat / 0run-aarch64.bat 等脚本,
或安装 QEMU 后用 qemu-system-x86_64.exe 加载 ISO。
5.4 调试
# 非 KASLR 调试构建(GDB 地址 = 链接地址)
cd kernel && make SS_BUILD_DIR="$(cd .. && pwd)" DEBUG=1
# 手动 QEMU 加 -s(gdbstub :1234);然后用 gdb 连接
gdb kernel/bin-x86_64/kernel
(gdb) target remote :1234
6. 测试与门禁
6.1 宿主测试(无需 QEMU)
cd tests
make -B stdc && ./bin/stdc_test # 用户态 libc 标准函数:217 PASS
make -B kmod && ./bin/kmod_test # 模块/组件门禁:PASS 6/6
make -B kmod-asan && ./bin/kmod_test_asan # ASAN+UBSAN 负向/fuzz:0 报告
make -B slub slub-poison fc fc-reg sched slub-mt fc-mt # 其余内核子系统套件
bash ../res/scripts/test/ci.sh # 全套 CI
bash ../res/scripts/test/golden.sh # 与金样逐行比对
tests/stdc 覆盖 Lua 所需的 setjmp/longjmp、字符串/数学/locale/time/stdio 新函数;
tests/kmod 覆盖:ELF 加载器正/负向 + 2000 次 fuzz、拓扑 DAG/环、能力策略、
syscall 注册表/座位、事务回滚、内建组件模型,以及 kernel 导入的 contract/ABI/size
强校验与 klib 直接符号解析。
6.2 QEMU 串口门禁(Windows PowerShell)
pwsh -File res/scripts/test/kmod_smoke.ps1 `
-Root C:\ZSY\SkylineSystem -WaitSeconds 200 -MinBuiltins 30
期望:KMOD SMOKE: PASS,串口包含 KMOD_SELFTEST PASS 12/12、
builtin ready ×37、kernel exports: 57 symbol(s)、桌面 PROCESS: 6,且无异常/STALL。
桌面 Lua 主题门禁(串口标记 + 截图像素采样):
pwsh -File res/scripts/test/lua_desktop_smoke.ps1 `
-Root C:\ZSY\SkylineSystem -UseDisk -WaitSeconds 90 `
-ExpectWallpaperTop 0x102040 -ExpectWallpaperBottom 0x7A2F6E `
-ExpectTitleColor 0x232A45 -RequireSource file
Installer / Settings / Notepad 对话框门禁(QEMU HMP 注入按键 + 串口标记 + 截图):
pwsh -File res/scripts/test/desktop_features_smoke.ps1 -Root C:\ZSY\SkylineSystem
pwsh -File res/scripts/test/setup_os_smoke.ps1 # Setup 安装整个 OS
pwsh -File res/scripts/test/doom_compact_smoke.ps1 # DOOM_TINY
pwsh -File res/scripts/test/doom_compact_smoke.ps1 -MemMB 64
GitHub Actions 的 .github/workflows/ci.yml 已接入宿主套件、kmod/ASAN、stdc、静态分析与金样门禁。
6.3 构建门禁速查
make -C kernel modules-check # .ko 段/重定位白名单
cd kernel && make kaslr-check # KASLR 32 位重定位清零检查
readelf -r kernel/bin-x86_64/kernel | grep 32S # 应为空
7. 文档
完整文档索引见 docs/README.md。常用入口:
| 文档 | 内容 |
|---|---|
| kernel-modules.md | kmod ABI、ET_REL 加载器、拓扑图、能力、事务加载/回滚、热替换、席位、Tier0 共享服务 |
| kernel-components.md | 全内核组件化台账:Tier 划分、内建组件线格式、启动映射、契约清单、迁移状态与路线图 |
| architecture.md | 分层、目录、启动序列(Tier0 + 组件拓扑) |
| scheduler.md | EEVDF + RIP 反馈调度器(含"它不做什么"说明) |
| memory.md | 4 级页表、大页、CoW、SLUB、TLB shootdown、W^X |
| smp.md | AP bring-up、per-CPU、GS base、XSave、SMAP/SMEP |
| syscall.md | 非 POSIX syscall ABI 参考 |
| gui.md | 并行软件合成器、窗口层、光标层、SDF 圆角/阴影与已知缺陷 |
| filesystems.md | VFS / SAF / lwext4 / FAT / 每 CPU 文件缓存 |
| network.md | e1000 驱动 + lwIP 移植、DHCP/ping/TCP 与边界 |
| lua-desktop.md | 桌面内嵌 Lua 5.4:预置 wallpaper FrameBuffer 变量(addr/width/height/pitch + 绘制方法)、sky.set_window_style 窗口主题、标准 C 补充与 QEMU 截图门禁 |
| desktop-features.md | Setup 安装整个 OS(SKYOS1/LZ4 + mkdir syscall + manifest)、Settings/Lua 主题、Notepad 对话框、开始菜单 + Explorer(readdir syscall 23)、桌面快捷键、命令邮箱、QEMU 验证与 AHCI/ext4 SMP 修复 |
| doom-extreme.md | DOOM_TINY 极限压缩:帧缓冲别名、去 RGBA 副本(省 575KiB)、WAD trim(11.16→9.07MB)、ADPCM 工具、64MiB zone=8 与 RP2040 对照 |
| stability-report.md · stability-audit.md | 长稳运行报告与稳定性审计 |
| ../SECURITY.md | 安全状态、明确边界、已知风险与漏洞上报流程 |
8. 设计原则
| 原则 | 在 SkylineSystem 中的含义 |
|---|---|
| 边界固定、实现开放 | syscall 对外契约固定;内部组件以私有契约自治(vendor.* 命名空间);内核只做加载/治理/回滚,不做业务接口胶水 |
| 机制与策略分离 | 调度器/分配器/VFS/syscall 入口等机制固定在 Tier 0;策略/实现以组件或座位形式可替换 |
| 先深度后广度 | 只把 x86_64 做深;其他架构仅有构建配置,移植尚未实现 |
| 诚实工程 | 文档明确写出"没做什么"与已知风险(无内存隔离、协作式 quiesce、FAT stub、组件化路线图等) |
| Built from source | 第三方组件(lwIP/FatFs/lwext4/flanterm/SAF/libart/hashmap/printf/x86mem/stb_truetype)均保留许可与来源说明 |
9. 已知限制与边界
- 仅 QEMU 验证:未在真机运行;测试内存 512 MB – 2 GB,默认 2 GB / 4 vCPU。
- 仅 x86_64:aarch64/riscv64/loongarch64 只有构建配置,未实现。
- 无 POSIX/Linux ABI:系统调用、libc 均为自有语义;不要期望 Linux 二进制兼容。
- kmod 无内存隔离:模块与内核同地址空间(与 Linux 内核模块同一信任级); 能力位/拓扑/事务/看门狗是治理边界,不是安全沙箱。quiesce 为协作式,错误模块可绕过。
- 组件化仍在收敛:FAT 仅基础接线、ATA/ATAPI 未注册;
kernel.netdev.v1已导出但 e1000/lwIP 胶水仍直接调用;kernel.input.v1为草案;分配策略仅接冷路径。 头文件暂集中kernel/include,组件私有头下沉到 modules 树列入路线图。 - 既有并发风险(pre-existing):文件缓存的
file_cache_tick在 PIT IRQ 上下文 持锁做较重工作,与 VMM/heap 锁存在跨核 AB-BA 窗口;kmod 自检已移到 sti 前单线程 以降低触发概率,根治方向记录在 kernel-components.md §11。 - GUI/DOOM 内存与 Setup 边界:56MiB 可用内存下 DOOM 与
Notepad/Settings 同时常驻会触发 PMM OOM;低内存模式优先 DOOM、桌面应用
延迟。Setup 安装的是完整 OS 系统树到 ext4
/mp/system,不做分区/MBR/ limine bios-install 的裸机写盘;默认不复制专有 doom.wad/TTF。DOOM_TINY 压的是固定 buffer/WAD 音频体积,不是 RP2040 384KB 级别。 - 调度器 RIP 反馈无量化基准:只验证 EWMA 收敛,不宣称性能收益。
10. License
kernel/:GPL-2.0-only(copyleft;分发修改后的内核二进制须提供完整修改源码)lib/、programs/、ablib/atomic/:MITablib/freestndchdrs/:GPL-3.0-or-later WITH GCC-exception-3.1 (可链接进独立/闭源程序,见该目录COPYING3.RUNTIME)- 内核与用户态运行在独立地址空间,仅通过 syscall 通信;按 FSF 指引,MIT 用户态代码 不构成 GPL 内核的衍生作品,无 copyleft 传染。
SPDX 头正在逐步补齐(当前覆盖率约 51%,尚未完全满足 REUSE);详见 LICENSES/、
根 LICENSE 与逐文件 SPDX 标签。
[!NOTE] 内核内 vendored 的第三方代码包括 lwIP、FatFs、lwext4、flanterm、SAF、 改编版 libart / tidwall hashmap、mpaland/printf、x86mem memops 与 stb_truetype 衍生光栅器;其许可(BSD-3 / BSD-2 / FatFs-license / MIT 等) 已在源文件中保留。
11. Thanks to
12. Main Contributors
- Yo-yo-ooo
- marceldobehere
- Arty3
- Renzaoren(QQ)
13. Connect
E-mail: [email protected]
如果构建失败,请先确认依赖齐全并附上 make 输出开 issue;欢迎讨论内核架构与模块治理设计。