diff --git a/docs/css/style.css b/docs/css/style.css
index 461676b..7704670 100644
--- a/docs/css/style.css
+++ b/docs/css/style.css
@@ -1529,6 +1529,10 @@ html.has-toc { scroll-padding-top: calc(var(--pg-header-h) + 3.5rem); }
margin-top: 0;
}
.table-wrap td:has(> .badge:only-child)::before { display: none; }
+ /* 最低 / 推荐对照表:卡片里两栏并排,一眼对比 */
+ .table-wrap table[data-keep-labels] tbody tr { grid-template-columns: repeat(2, minmax(0, 1fr)); }
+ .table-wrap table[data-keep-labels] tbody tr > th { grid-column: 1 / -1; }
+ .table-wrap table[data-keep-labels] tbody tr > td { grid-column: auto; grid-row: 2; margin-top: var(--pg-space-2); }
/* 数字列(行数等)同样放到标题右边,条形图缩短后跟在数字上方 */
.table-wrap tbody tr > td.num {
grid-column: 2;
@@ -1544,6 +1548,167 @@ html.has-toc { scroll-padding-top: calc(var(--pg-header-h) + 3.5rem); }
.table-wrap td.num { text-align: left; }
}
+/* ---------- 文档式正文(介绍页):排版像渲染后的 Markdown ----------
+ 左边吸顶目录,右边单栏文章。只用标题、段落、列表、表格和提示块,不用卡片网格。 */
+.doc-section { padding-block: var(--pg-space-8) var(--pg-space-9); }
+.doc {
+ display: grid;
+ grid-template-columns: 12.5rem minmax(0, 46rem);
+ gap: var(--pg-space-8);
+ justify-content: center;
+ align-items: start;
+}
+.doc-toc-title { display: none; }
+
+.prose {
+ min-width: 0;
+ font-size: 1.03125rem;
+ line-height: 1.85;
+ color: var(--pg-fg-2);
+}
+.prose > * + * { margin-top: var(--pg-space-4); }
+.prose > :first-child { margin-top: 0; }
+.prose h2 {
+ margin-top: var(--pg-space-8);
+ padding-bottom: var(--pg-space-3);
+ font-size: var(--pg-text-xl);
+ line-height: var(--pg-leading-tight);
+ letter-spacing: -0.02em;
+ border-bottom: var(--pg-hairline) solid var(--pg-line-2);
+}
+.prose h3 {
+ margin-top: var(--pg-space-6);
+ font-size: var(--pg-text-lg);
+ letter-spacing: -0.01em;
+}
+/* 标题前的 # / ## 只是装饰,读屏时忽略(content 的 / "" 是替代文本) */
+.prose h2::before,
+.prose h3::before {
+ content: "#";
+ content: "#" / "";
+ margin-right: 0.45em;
+ font-family: var(--pg-font-mono);
+ font-weight: 500;
+ color: var(--pg-brand);
+}
+.prose h3::before { content: "##"; content: "##" / ""; color: var(--pg-fg-3); }
+.prose h2 + *,
+.prose h3 + * { margin-top: var(--pg-space-3); }
+.prose strong { font-weight: 650; color: var(--pg-fg-1); }
+.prose a { text-decoration-color: var(--pg-line-strong); }
+.prose a:hover { text-decoration-color: currentColor; }
+
+.prose ul,
+.prose ol { padding-left: 1.5rem; list-style: none; }
+.prose li { position: relative; }
+.prose li + li { margin-top: var(--pg-space-2); }
+.prose ul > li::before {
+ content: "-";
+ content: "-" / "";
+ position: absolute;
+ left: -1.25rem;
+ font-family: var(--pg-font-mono);
+ font-weight: 700;
+ color: var(--pg-brand);
+}
+.prose ol { counter-reset: md; }
+.prose ol > li { counter-increment: md; }
+.prose ol > li::before {
+ content: counter(md) ".";
+ position: absolute;
+ left: -1.5rem;
+ font-family: var(--pg-font-mono);
+ font-size: var(--pg-text-sm);
+ font-weight: 700;
+ color: var(--pg-brand);
+}
+
+/* 提示块:GitHub 风格,左侧一条色条 */
+.prose .notice {
+ padding: var(--pg-space-3) var(--pg-space-4);
+ background: var(--pg-accent-soft);
+ border: 0;
+ border-left: 0.25rem solid var(--pg-brand);
+ border-radius: var(--pg-radius);
+ box-shadow: none;
+}
+.prose .notice-warn { background: var(--pg-warn-bg); border-left-color: var(--pg-warn-fg); }
+.prose .notice p { font-size: var(--pg-text-sm); }
+
+/* 表格:Markdown 表格的样子,带边框和隔行底色(手机上仍是堆叠卡片) */
+@media (min-width: 48.01rem) {
+ .prose .table-wrap {
+ padding: 0;
+ background: none;
+ border: 0;
+ border-radius: 0;
+ box-shadow: none;
+ }
+ .prose table { font-size: var(--pg-text-sm); }
+ .prose :is(th, td),
+ .prose tbody tr:last-child > * {
+ padding: var(--pg-space-2) var(--pg-space-4);
+ border: var(--pg-hairline) solid var(--pg-line-2);
+ }
+ .prose thead th { color: var(--pg-fg-1); background: var(--pg-bg-sunken); }
+ .prose tbody tr:nth-child(even) { background: var(--pg-bg-sunken); }
+ .prose tbody tr:hover { background: var(--pg-accent-soft); }
+}
+
+/* 电脑:目录是左侧的竖排列表,当前小节左边亮一条品牌色 */
+@media (min-width: 62.01rem) {
+ .doc > .doc-toc {
+ position: sticky;
+ top: calc(var(--pg-header-h) + var(--pg-space-5));
+ background: none;
+ border: 0;
+ -webkit-backdrop-filter: none;
+ backdrop-filter: none;
+ }
+ .site-header.is-hidden ~ main .doc > .doc-toc { top: var(--pg-space-5); }
+ .doc-toc-title {
+ display: block;
+ margin-bottom: var(--pg-space-3);
+ font-family: var(--pg-font-mono);
+ font-size: var(--pg-text-2xs);
+ letter-spacing: var(--pg-tracking-label);
+ text-transform: uppercase;
+ color: var(--pg-fg-3);
+ }
+ .doc-toc ul {
+ flex-direction: column;
+ gap: 0;
+ padding: 0;
+ overflow: visible;
+ border-left: var(--pg-hairline) solid var(--pg-line-2);
+ }
+ .doc-toc a,
+ .doc-toc a:hover,
+ .doc-toc a[aria-current] {
+ margin-left: -1px;
+ padding: 0.375rem 0 0.375rem var(--pg-space-4);
+ font-size: var(--pg-text-sm);
+ white-space: normal;
+ background: none;
+ border: 0;
+ border-left: var(--pg-stroke) solid transparent;
+ border-radius: 0;
+ }
+ .doc-toc a:hover { color: var(--pg-fg-1); border-left-color: var(--pg-line-strong); }
+ .doc-toc a[aria-current] { color: var(--pg-fg-1); border-left-color: var(--pg-brand); }
+}
+/* 平板和手机:单栏,目录变成顶部横向的目录条 */
+@media (max-width: 62rem) {
+ .doc { grid-template-columns: minmax(0, 1fr); gap: var(--pg-space-6); }
+ .doc > .doc-toc { margin-inline: calc(var(--pg-space-5) * -1); }
+}
+@media (max-width: 56rem) {
+ .doc > .doc-toc { margin-inline: calc(var(--pg-space-4) * -1); }
+ .doc-section { padding-block: var(--pg-space-6) var(--pg-space-8); }
+ .prose { font-size: var(--pg-text-md); }
+ .prose h2 { margin-top: var(--pg-space-7); }
+}
+
/* 用户要求减少动态效果时,关掉所有装饰性动画与过渡 */
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
diff --git a/docs/index.html b/docs/index.html
index 7506733..33ef26f 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -7,7 +7,7 @@
GoutouStdio
-
+
@@ -239,7 +239,7 @@
-
+
diff --git a/docs/js/main.js b/docs/js/main.js
index bcfb01d..48c0e0f 100644
--- a/docs/js/main.js
+++ b/docs/js/main.js
@@ -145,7 +145,7 @@
totals[i] = (totals[i] || 0) + cell.textContent.trim().length;
});
});
- var main = totals.indexOf(Math.max.apply(null, totals));
+ var main = table.hasAttribute("data-keep-labels") ? -1 : totals.indexOf(Math.max.apply(null, totals));
rows.forEach(function (tr) {
Array.prototype.forEach.call(tr.children, function (cell, i) {
var label = heads[i] && heads[i].textContent.trim();
@@ -196,6 +196,7 @@
function initFold() {
document.querySelectorAll("main .table-wrap:not([data-nofold]) table").forEach(function (table) {
+ if (table.closest(".prose")) return; // 文档式正文已经精简过,表格全部展开
var rows = Array.prototype.slice.call(table.querySelectorAll("tbody > tr"));
makeFold(table, rows, FOLD_ROWS);
});
@@ -240,6 +241,15 @@
function initToc() {
var main = document.querySelector("main");
if (!main) return;
+ // 文档式页面自带静态目录(没有脚本也能用),这里只负责高亮当前小节
+ var docToc = main.querySelector(".doc-toc");
+ if (docToc) {
+ var docLinks = Array.prototype.slice.call(docToc.querySelectorAll("a[href^='#']"));
+ var targets = docLinks.map(function (a) { return document.getElementById(a.getAttribute("href").slice(1)); });
+ document.documentElement.classList.add("has-toc");
+ spy(docToc.querySelector("ul"), docLinks, targets);
+ return;
+ }
var sections = Array.prototype.slice.call(main.querySelectorAll(":scope > section.section[id]")).filter(function (s) {
return s.querySelector("h2");
});
@@ -263,6 +273,11 @@
else main.prepend(nav);
document.documentElement.classList.add("has-toc");
+ spy(ul, links, sections);
+ }
+
+ // 滚动时高亮当前小节:目标越过视口上方 40% 的位置就算进入
+ function spy(ul, links, targets) {
if (!("IntersectionObserver" in window)) return;
var current = null;
function activate(a) {
@@ -277,10 +292,10 @@
}
var io = new IntersectionObserver(function (entries) {
entries.forEach(function (e) {
- if (e.isIntersecting) activate(links[sections.indexOf(e.target)]);
+ if (e.isIntersecting) activate(links[targets.indexOf(e.target)]);
});
}, { rootMargin: "-40% 0px -55% 0px" });
- sections.forEach(function (s) { io.observe(s); });
+ targets.forEach(function (t) { if (t) io.observe(t); });
}
function init() {
diff --git a/docs/ota/index.html b/docs/ota/index.html
index ad9e692..7e0f5ea 100644
--- a/docs/ota/index.html
+++ b/docs/ota/index.html
@@ -7,7 +7,7 @@
PySpOS 更新包 | GoutouStdio
-
+
@@ -224,7 +224,7 @@
-
+
diff --git a/docs/ota/releases.html b/docs/ota/releases.html
index a4e896b..a5f082c 100644
--- a/docs/ota/releases.html
+++ b/docs/ota/releases.html
@@ -7,7 +7,7 @@
PySpOS 版本历史 | GoutouStdio
-
+
@@ -154,7 +154,7 @@
-
+
diff --git a/docs/pyspos.html b/docs/pyspos.html
index 9a2f547..ef29ef7 100644
--- a/docs/pyspos.html
+++ b/docs/pyspos.html
@@ -7,7 +7,7 @@
PySpOS | GoutouStdio
-
+
@@ -80,7 +80,7 @@
PySpOS
-
用 Python 写的模拟操作系统。它跑在宿主系统上,自己实现了 shell、进程调度、文件系统、引导流程和 OTA 更新,也能执行 x86_64 的 ELF 程序。
+
用 Python 写的模拟操作系统,跑在宿主系统上。有 shell、进程调度、文件系统和 OTA 更新,还能执行 x86_64 ELF 程序。
下载 3.2.0
查看源码
@@ -105,140 +105,84 @@
PySpOS
0 0 Sleeping idle swapper/0
1 0 Sleeping init init
2 1 Running shell pyspos-sh
-
shell 中 help 与 ps 的输出(节选)。格式取自 src/commands.py、src/shell/proc_cmds.py 和 src/process.py;PID 0、1、2 是保留进程。
+
shell 里 help 和 ps 的输出(节选)。PID 0、1、2 是保留进程。
-
-
-
- 真子进程 应用是独立的 OS 进程,有 PID、父子关系和信号。
- EEVDF 调度 参照 Linux 6.6+,按虚拟截止期和 nice 权重排程。
- ELF 引擎 Unicorn 执行 x86_64 指令,缺它时退回自研模拟器。
- A/B 升级 更新装进非活动槽位,校验后切换,失败可回滚。
-
-
-
+
+
+
+ 本页目录
+
+
+
+ 简介
+ PySpOS 从 2022 年的“MP4 架构狗头 OS”演变而来。应用是独立的进程,调度器参照 Linux 的 EEVDF。
+
+ 真子进程 :应用有 PID、父子关系和信号。
+ EEVDF 调度 :按虚拟截止期和 nice 权重排程。
+ ELF 引擎 :Unicorn 执行 x86_64 指令;没装时退回自研的 SpaceCPU 1 Pro。
+ A/B 升级 :更新装进非活动槽位,校验后切换,失败可回滚。
+
+ 动态链接(INTERP)和 TLS 还没有实现。
-
-
-
-
一条命令的执行路径
-
以外部程序为例:从按下 Enter 到系统调用,经过这三步。
-
-
-
- 1
- Shell:parse → dispatch
- Shell 把输入解析成命令和参数,再交给对应的模块。管道、重定向和后台作业都从这里开始。
- src/shell/dispatch.py
-
-
- 2
- 进程:fork → exec
- 外部应用通过 fork / exec 运行,是独立的进程。调度器用虚拟运行时间和截止期安排执行。
- src/forkexec.py · src/process.py
-
-
- 3
- 运行时:execute → syscall
- ELF 由 Unicorn 执行 x86_64 指令,系统调用转发到内置的模拟层。可以观察执行、改实现,再运行一次。
- Unicorn Engine → syscall
-
-
-
-
+ 一条命令怎么执行
+
+ Shell :解析输入并分发给对应模块。管道、重定向和后台作业从这里开始。
+ 进程 :外部程序经 fork / exec 成为独立进程,由调度器安排运行。
+ 运行时 :Unicorn 执行 ELF 指令,系统调用转给内置的模拟层。
+
-
-
-
概览
-
-
PySpOS 从 2022 年的“MP4 架构狗头 OS”一路改过来。现在的版本能跑命令、管理文件、执行 ELF 程序;应用是独立进程,调度器参照 Linux 的 EEVDF。
-
3.2.0 重构了内部结构:原先 1217 行的 main.py 拆成 src/shell/ 下的 sys、elf、ota、proc、dispatch 几个模块,原文件留作兼容层。调度在 process.py,进程引擎在 forkexec.py。
-
ELF 默认由 Unicorn Engine 执行真实的 x86_64 指令,系统调用转发给内置的模拟层。没装 unicorn 时退回自研的 SpaceCPU 1 Pro 模拟器,Windows 上也能跑。动态链接(INTERP)和 TLS 还没有实现。
-
-
-
- 当前版本 v3.2.0 RC1
- 项目启动 2022
- 核心语言 Python(另有部分 C 测试程序)
- 升级方式 A/B 槽位,可在本地回滚
- 程序格式 ELF(x86_64)、SPF 脚本
- 测试 按子系统分组,在 GitHub Actions 上运行
-
-
-
-
-
-
+ 3.2.0 更新
+ 这一版把 1217 行的 main.py 拆进了 src/shell/,原文件保留为兼容层。
+
+ 进程 :不再是协作式模拟。PID 0、1、2 依次引导,孤儿进程由 init 收养。
+ 调度 :EEVDF,参照 Linux 6.6+ 的权重表、vruntime 和虚拟截止期。
+ 后台作业 :cmd &、jobs、fg、bg、wait,以及进程组与会话。
+ ELF 调试 :加 --stats、--map、--disasm、--strace 观察执行过程。
+ 窗口 :VortexGlass 管理窗口和输入,应用可以用 Python SDK 开窗口、画控件,见 vortexglass.md 。
+ 开机向导 :11 步 curses 向导,语言和时区会实际生效,用 oobe 重跑。
+ 终端 :中文按双宽排版,修好了按 Enter 出现 ^M 的问题。
+ 命令 :分组 help、Tab 补全、管道和重定向;apps/ 下的程序可以直接执行。
+ 配置 :SpaceConfig v2(.spc),带 Schema 校验和迁移工具。
+ OTA :云端已恢复,Recovery 里可以选版本装到指定槽位。
+ 出厂重置 :recovery.erase 清理 8 类数据。
+ 许可 :改用 MIT。
+
-
-
-
3.2.0 的改动
-
- 进程 应用是独立的 OS 进程,不再是协作式模拟。PID 0(swapper)、1(init)、2(shell)依次引导;孤儿进程由 init 收养,退出后先成为僵尸,再被回收。
- 调度 EEVDF(Earliest Eligible Virtual Deadline First),参照 Linux 6.6+:nice 权重表、vruntime、虚拟截止期和信号状态机。
- 后台作业 cmd &、jobs、fg、bg、wait、$!,以及进程组与会话。前台交互经管道中继,后台作业的 stdin 接 /dev/null。
- ELF 引擎 默认用 Unicorn,没装就用 SpaceCPU 1 Pro。可以加 --stats、--map、--disasm、--strace 观察执行过程。
- 窗口 API VortexGlass 管理窗口和输入。应用可以用 Python SDK 开多个窗口、处理键盘鼠标事件、绘制控件,或直接提交 RGBA 像素。记事本、文件浏览器和绘图程序各自持有界面和逻辑。API 与示例见 vortexglass.md 。
- 首次开机向导 共 11 步的 curses 向导。语言和时区设置会实际生效(zoneinfo + TZ),完成标记写在 etc/.oobe_done,可以用 oobe 命令重跑。
- 终端 TUI 按显示宽度排版(CJK 双宽),并去掉完整的 ANSI 转义序列。输入侧有 stty sane 恢复、输入归一化和重试上限,按 Enter 出现 ^M 的问题已修复。
- 命令 命令走元数据注册表:分组 help、help <cmd>、Tab 补全,支持管道和重定向。PATH=apps/ 下的外部程序可以直接执行。
- SpaceConfig v2 .spc 配置格式,支持转义、行尾注释、null 和列表,带 Schema 校验,以及 spc_get / set / migrate 工具。
- A/B 槽位与回滚 更新装进非活动槽位,校验通过后再切换,失败可以回滚。OTA 云端已恢复(goutoustdio.rainyland.top),在 Recovery 里也可以从云端选版本装到指定槽位。
- 出厂重置 recovery.erase 清理 8 类数据,包括题库历史、shell 历史和整棵目录树的 __pycache__。
- SPF 脚本 SPF(Space Portable Format)是自研的脚本格式,支持变量、算术、输入和引入。
- 许可与测试 3.2.0 起使用 MIT 许可,代码在 ViudiraTech/PySpOS 。回归测试在 GitHub Actions 上运行。
-
-
-
-
-
-
-
-
模块
-
每个模块只列一行,完整说明在仓库 README 和源码注释里。
-
-
+
源码结构
- 模块 文件 作用
+ 位置 作用
- 主循环 src/kernel.py处理用户输入、执行命令、管理应用运行,启动时初始化各子系统。入口是 kernel.loop()。
- SPF 解析 src/parse_spf.py解析并执行 SPF 文件,支持 putchar() 与 exit() 系统调用。
- OTA 更新 src/ota.py版本检查、下载、验证、安装,云端地址是 goutoustdio.rainyland.top。
- 文件系统 src/fs.pylist / create / read / delete 等文件操作 API,基于 os 和 shutil 实现。
- 配置管理 src/btcfg.py管理启动配置(ROOT 权限、启动器锁定状态),存放在 etc/bootcfg.json。
- ELF 运行 src/elf_loader/ELF 加载、CPU 模拟和系统调用模拟,支持 x86 / x86_64。用法:run program.elf,可加 --stats / --map / --strace。
+ src/kernel.py主循环:处理输入、执行命令、初始化子系统
+ src/shell/命令解析与分发
+ src/process.py进程与调度
+ src/elf_loader/ELF 加载、CPU 与系统调用模拟
+ src/parse_spf.pySPF 脚本(自研格式)
+ src/ota.py更新的检查、下载、校验和安装
+ src/fs.py文件操作 API
+ src/btcfg.py启动配置,存在 etc/bootcfg.json
-
-
-
-
-
-
兼容性
-
-
-
-
- Windows Windows 7 及以上,兼容性最好
- Linux 主流发行版(Ubuntu、Debian、Fedora 等)
- macOS macOS 10.14 及以上
- Python 3.10 及以上;CI 覆盖 3.10、3.12、3.14
-
-
-
-
-
+
运行环境
+
+ Python :3.10 或更高。
+ 系统 :Windows 7+、主流 Linux 发行版、macOS 10.14+。
+
+
详见配置要求 。更新包在下载页 ,源码在 ViudiraTech/PySpOS 。
+
@@ -289,7 +233,7 @@
-
+
diff --git a/docs/requirements.html b/docs/requirements.html
index 549df5e..063b365 100644
--- a/docs/requirements.html
+++ b/docs/requirements.html
@@ -7,7 +7,7 @@
配置要求 | GoutouStdio
-
+
@@ -79,100 +79,89 @@
配置要求
-
PySpOS 是跑在宿主系统上的 Python 程序;SpaceOS 8 和 9 是要自己启动的内核。条件差别大,所以按产品分开写。
+
按产品列出最低配置和推荐配置。最低配置能运行,推荐配置体验更好。
-
-
-
PySpOS 3.2.0
-
-
纯用户态,不直接操作硬件,能跑 Python 的机器就能跑。
-
-
+
+
+
+ 本页目录
+
+
+
+ PySpOS 3.2.0
+ 纯用户态程序,能跑 Python 就能跑。
+
+
+
+ 项目 最低配置 推荐配置
+
- Python 3.10 或更高。CI 覆盖 3.10、3.12、3.14。
- 系统 Windows 7 及以上、Linux 各发行版、macOS。
- 磁盘 约 120 MB。不需要管理员权限。
- CPU / 内存 双核 CPU、512 MB 内存足够,不需要独立显卡。
- 终端 curses 的首次开机向导需要 80×24 字符的终端。SSH、tmux、Windows Terminal 都可以。
- 可选依赖 unicorn(ELF 引擎,缺失时退回自研模拟器);tzdata(真实时区,Windows 和精简容器镜像需要)。都不是硬性要求。
+ Python 3.10 3.12 或 3.14(CI 测过的版本)
+ 系统 Windows 7、主流 Linux、macOS 10.14 同左
+ 处理器 双核 同左
+ 内存 512 MB 同左
+ 存储 120 MB 可用空间 同左
+ 终端 80×24 字符 同左
+ 可选依赖 无 unicorn(ELF 引擎)、tzdata(真实时区)
- PySpOS 介绍 · 下载更新包
-
-
-
+ 不需要管理员权限和独立显卡。缺 unicorn 时退回自研模拟器,Windows 和精简容器镜像需要 tzdata 才有真实时区。
-
-
-
SpaceOS 9 公开预览
-
+
SpaceOS 9 公开预览
目前只在 QEMU 上验证过。
-
-
+
+
+
+ 项目 最低配置 推荐配置
+
- 虚拟机 x86_64 QEMU,推荐 Q35 机型和 VirtIO GPU 2D。
- 固件 OVMF UEFI 固件。
- 内存 至少 512 MiB。
- 未验证 真实硬件、真实 GPU、音频、网络、睡眠唤醒。
- 其他架构 aarch64 / riscv64 只通过编译检查,镜像里没有它们的用户态。
+ 平台 x86_64 QEMU x86_64 QEMU,Q35 机型
+ 固件 OVMF(UEFI) 同左
+ 内存 512 MiB 同左
+ 显示 — VirtIO GPU 2D
- SpaceOS 9 介绍 · QEMU 启动命令
-
-
-
+ 真实硬件、GPU、音频、网络和睡眠唤醒都没有验证。aarch64 / riscv64 只通过编译检查,镜像里没有它们的用户态。启动命令见下载页 。
-
-
-
SpaceOS 8
-
-
-
-
-
请用可抛弃的机器和测试盘
-
NTFS 写入驱动目前还不能信任,确认稳定前不要让它碰重要数据。已在 Dell PowerEdge R410 等实体服务器上验证。
-
-
+
SpaceOS 8
+
+
+
+
请用可抛弃的机器和测试盘
+
NTFS 写入驱动还不能信任,不要让它碰重要数据。
-
表里“已验证”是实际跑过的组合,“默认关闭”的需要自己在 make menuconfig 里打开。
-
-
+
+
+
- 硬件 要求 状态
+ 项目 最低配置 推荐配置
- 处理器 x86_64 必需。多核可用,SMP 启动会拉起全部核心,并在核间迁移任务、均衡负载。 已验证
- 内存 最低 128 MB,512 MB 可启动。跑图形桌面并使用 swap,建议 1 GB 以上。
- 固件 经 Limine 引导,UEFI 与 Legacy 两种模式都支持,不挑固件实现。 UEFI 已验证
- 输入 PS/2 键盘和鼠标是主路径,提供 Linux 兼容的 evdev;另支持 USB HID(键盘、鼠标、消费类控制器)。PS/2 路径仍在验证中。 xHCI USB HID 已验证
- 显示 DRM/KMS 内核核心、通用 GPU 驱动注册表、内置 VirtIO-GPU 驱动;GOP 帧缓冲控制台(点阵字体)和软件帧缓冲兜底。没接显卡时可用 GOP 文本控制台。 真实 GPU 驱动未完成
- 存储 IDE/ATA、AHCI(SATA)、NVMe、USB Mass Storage 都有驱动(NVMe 已启用)。默认根文件系统是 tmpfs。 NTFS 写入不建议用
- 网络 需要 Intel e1000 / e1000e 或 Realtek RTL8139 / RTL8169。协议栈自研,客户端带 DHCP。其他网卡可能无法联网。 需要指定网卡
- 音频(可选) Sound Blaster 16 与 Intel HD Audio,带 ALSA 兼容的 PCM / control ABI。SB16 需要在 menuconfig 里打开。 SB16 默认关闭
+ 处理器 x86_64 x86_64 多核(支持 SMP)
+ 内存 128 MB 1 GB 以上(图形桌面 + swap)
+ 固件 UEFI 或 Legacy BIOS UEFI(已验证)
+ 显示 GOP 帧缓冲 VirtIO-GPU;真实显卡驱动未完成
+ 存储 不需要(默认根是 tmpfs) IDE / AHCI / NVMe / USB 存储
+ 输入 PS/2 键盘和鼠标 USB 键盘和鼠标(xHCI,已验证)
+ 网络 可以不接 Intel e1000 / e1000e 或 Realtek RTL8139 / RTL8169
+ 音频 可以没有 Intel HD Audio
- 构建
- 必需:make、gcc(建议 13.3+)、qemu、xorriso。建议:clang-format、clang-tidy。只有 menuconfig 需要 kconfig-frontends 和 libncurses-dev。
- sudo apt install build-essential qemu-system-x86 xorriso libncurses-dev
- 默认关闭的功能
- 有些子系统在 Kconfig 里默认是 n,要用得自己打开:VIRTIO / VIRTIO_GPU(虚拟化设备)、SOUND_SB16(声卡)。用 make menuconfig 打开,并确认虚拟机或实体机上有对应设备。新增 GPU 驱动,是在 drivers/gpu/gpu_drivers.c 的注册表里加一条记录。
- SpaceOS 8 介绍 · 内核源码与构建说明
-
-
-
+ VirtIO 和 SB16 声卡默认关闭,要用 make menuconfig 打开。实体机已在 Dell PowerEdge R410 上验证。构建依赖见 SpaceOS 8 介绍 。
-
@@ -223,7 +212,7 @@
-
+
diff --git a/docs/spaceos6.html b/docs/spaceos6.html
index c5ea896..01ff5f2 100644
--- a/docs/spaceos6.html
+++ b/docs/spaceos6.html
@@ -7,7 +7,7 @@
SpaceOS 6(已停更) | GoutouStdio
-
+
@@ -80,7 +80,7 @@
已停更
SpaceOS 6
-
基于 Uinxed-Kernel 的桌面操作系统:SPUI 1.0 界面、SPF Parser 2.0、SPFS 2.0 文件系统。这是团队第一次接触 UEFI。
+
基于 Uinxed-Kernel 的桌面系统,带 SPUI 1.0 界面和 SPFS 2.0 文件系统。这是团队第一次接触 UEFI。
版本 6.0
首次发布 2024
@@ -91,54 +91,50 @@ SpaceOS 6
-
-
-
-
-
+
+
+
+ 本页目录
+
+
+
+
-
-
-
-
背景
-
-
SpaceOS 6 基于 ViudiraTech 开发的 Uinxed-Kernel 深度定制,2024 年开始研发,内核优化、用户界面、文件系统和硬件驱动都是自己做的。
-
Uinxed-Kernel 是 64 位宏内核,运行在 CPU Ring 0,进程调度、内存管理、文件系统和设备驱动都在内核空间。SPUI(SpaceOS User Interface)1.0 是自研的桌面环境。硬件上支持 AHCI / NVMe 存储、SB16 声卡、JPG 硬件加速和分区表,可以多系统部署。
-
-
-
+ 背景
+ 2024 年开始,在 ViudiraTech 的 Uinxed-Kernel 上深度定制。界面、文件系统和驱动是自己做的。
-
-
-
做到的部分
-
- SPUI 1.0 桌面 自研桌面环境,支持窗口管理、任务栏和开始菜单。
- SPF Parser 2.0 解析并执行 SPF(SpaceOS Format)可执行文件。2.0 版性能更好,支持更多系统调用。
- JPG 图片解析 原生支持 JPG 解析与显示,不依赖第三方库。
- SB16 声卡 SB16 声卡驱动,支持 PCM 播放和 MIDI 合成。
- 分区表与存储 分区表、AHCI、NVMe,多分区管理和引导加载器配置。
- SPFS 2.0 自研文件系统,带文件权限管理和日志,面向硬盘优化读写延迟和吞吐。
-
-
-
+ 做到的部分
+
+ SPUI 1.0 :自研桌面,有窗口管理、任务栏和开始菜单。
+ SPF Parser 2.0 :执行 SPF 可执行文件,支持更多系统调用。
+ SPFS 2.0 :自研文件系统,带权限管理和日志。
+ 存储 :IDE / AHCI / NVMe,MBR 与 GPT 分区表,可以多系统部署。
+ 音频 :SB16 驱动,支持 PCM 播放和 MIDI。
+ 图片 :原生 JPG 解析,不依赖第三方库。
+
-
-
-
内核与子系统
-
- Uinxed-Kernel ViudiraTech 开发的 64 位宏内核,运行在 Ring 0,提供系统调用、进程调度、内存管理和文件系统。
- 宏内核架构 进程管理、内存管理、文件系统和设备驱动都在内核空间。
- 内存管理 分页和内存保护。
- 存储 IDE / AHCI / NVMe 接口,MBR 与 GPT 分区表。
- 音频 SB16 兼容驱动,DMA 传输,音频混合与音量控制。
- 当年的配置要求 x86 处理器(Pentium 及以上),内存最低 64 MB(推荐 128 MB 以上),至少 500 MB 可用空间,VESA 兼容显卡(800×600)。
-
+
内核
+
Uinxed-Kernel 是 64 位宏内核,运行在 Ring 0。调度、内存、文件系统和驱动都在内核空间,内存有分页和保护。
+
+
当年的配置要求
+
+ Pentium 及以上的 x86 处理器。
+ 内存 64 MB,推荐 128 MB 以上。
+ 500 MB 可用空间。
+ VESA 兼容显卡,800×600。
+
+
@@ -189,7 +185,7 @@
-
+
diff --git a/docs/spaceos7.html b/docs/spaceos7.html
index b56f7cc..ba5a159 100644
--- a/docs/spaceos7.html
+++ b/docs/spaceos7.html
@@ -7,7 +7,7 @@
SpaceOS 7(已停更) | GoutouStdio
-
+
@@ -89,65 +89,49 @@
SpaceOS 7
-
-
-
-
-
背景
-
-
2026 年,团队研究清楚 UEFI 之后启动了这个项目:没有外部代码,没有依赖,UEFI 引导和内核加载全部自己写。设计目标写的是“完全自研、混合内核、极致性能”,混合内核想兼顾微内核的稳定和宏内核的性能。
-
做到约一半时停止:用户态没做完,还存在 Heisenbug。中间重构过一次引导和内核;桌面环境运行在 Ring 3,桌面崩溃不会拖垮内核。
+
+
+
+ 本页目录
+
+
+
+
-
-
-
-
做到的部分
-
- SPFS 2.0 Ultra 自研文件系统,带 Journal 日志、CRC64 数据校验和缓存块机制。
- 内核重构 引导程序自己写(没用 Limine / GRUB);放弃 Uinxed-Kernel,改为纯自研;伙伴系统加 Slab 分配器;进程间 IPC 和用户态支持。
- Ring 3 桌面 桌面跑在用户空间,与内核隔离,桌面崩溃不影响内核。
- SMP 多核 多核调度、同步机制、内存管理和中断处理。
- xHCI 控制器 xHCI 驱动,支持 USB 3.0 及以上,向后兼容 USB 2.0。
- 空间 API 自研的系统调用接口,包含系统调用、IPC 和权限控制。
-
-
-
+ 背景
+ 2026 年搞懂 UEFI 后启动:不用外部代码,引导和内核加载全部自己写。目标是混合内核,兼顾微内核的稳定和宏内核的性能。
+ 做到约一半时停止:用户态没完成,还有难以复现的 Heisenbug。
-
-
-
内核设计
-
- 混合内核 微内核组件放到用户空间,关键服务留在内核空间;有 IPC 和权限管理。
- UEFI 库 从零写的 UEFI 库,高半地址内核加载,不依赖外部引导代码。
- 内存管理 Buddy System 加 Slab 分配器,4 KB 与 2 MB 大页,虚拟内存和硬件辅助的内存保护。
- 进程调度 CFS 完全公平调度,支持实时调度、多核负载均衡与节能调度。
- 设备驱动 存储(IDE / AHCI / NVMe / USB / SCSI)、显示、网络、音频、输入,以及 xHCI USB 驱动。
-
-
-
+ 做到的部分
+
+ 自写引导 :没用 Limine 或 GRUB,也不再基于 Uinxed-Kernel。
+ 混合内核 :微内核组件放在用户空间,关键服务留在内核,带 IPC 和权限控制。
+ 内存 :Buddy + Slab 分配器,4 KB 与 2 MB 页。
+ 调度 :CFS,支持实时调度和多核负载均衡。
+ Ring 3 桌面 :桌面跑在用户空间,崩溃不影响内核。
+ SPFS 2.0 Ultra :自研文件系统,带日志和 CRC64 校验。
+ 驱动 :xHCI(USB 3.0+)、存储、显示、网络、音频和输入。
+ 空间 API :自研的系统调用、IPC 和权限接口。
+
-
-
-
进展
-
- 搞懂 UEFI 理解 UEFI 之后,启动完全自研的操作系统项目。(用户态没做好)
- 混合内核设计 完成混合内核的架构设计。
- 内核实现 完成内核基本功能:进程调度、内存管理、中断处理。
- Ring 3 桌面 实现用户空间的桌面环境。
-
+
进展
+
+ 搞懂 UEFI,启动项目。
+ 完成混合内核的架构设计。
+ 实现调度、内存管理和中断处理。
+ 实现 Ring 3 桌面,之后停止。
+
+
@@ -198,7 +182,7 @@
-
+
diff --git a/docs/spaceos8-download.html b/docs/spaceos8-download.html
index 0284059..c156dfb 100644
--- a/docs/spaceos8-download.html
+++ b/docs/spaceos8-download.html
@@ -7,7 +7,7 @@
下载 SpaceOS 8 | GoutouStdio
-
+
@@ -239,7 +239,7 @@
-
+
diff --git a/docs/spaceos8.html b/docs/spaceos8.html
index a9e16a2..7ce53fc 100644
--- a/docs/spaceos8.html
+++ b/docs/spaceos8.html
@@ -7,7 +7,7 @@
SpaceOS 8 | GoutouStdio
-
+
@@ -81,7 +81,7 @@
抢先体验 上一代
SpaceOS 8
-
内核是 C 写的 UNIX-like 内核 Uinxed-Kernel,用户态是一套自研的桌面和系统程序,包括窗口合成器、浏览器和文件管理器。第二版 slim 镜像修好了 xHCI 上的 USB HID,USB 键盘和鼠标现在可以用;第一版里它们插上没有反应。
+
内核是 C 写的 UNIX-like 内核 Uinxed-Kernel,用户态是一整套自研的桌面和系统程序。第二版镜像修好了 xHCI 上的 USB 键盘和鼠标。
- Minecraft 运行在 Uinxed 内核上:用户态是 Alpine Linux v3.24,桌面是 Weston(Wayland),终端是 weston-terminal 14.0.2,宿主是 QEMU/KVM Q35。窗口、输入和渲染正常。
+ Minecraft 运行在 Uinxed 内核上(Alpine Linux v3.24 + Weston,QEMU/KVM)。
-
-
-
- 自研用户态 桌面、合成器、浏览器和系统程序,约 29.2 万行。
- X11 兼容层 120 个核心协议请求,能运行 DOOM 这类图形程序。
- Uinxed 内核 C 写的 UNIX-like 内核,实现 Linux 6.12 系统调用 ABI。
- 实体机验证 已在 Dell PowerEdge R410 等实体服务器上启动。
-
-
-
-
-
抢先体验版,不是正式 release
-
内核已在实体服务器上启动,桌面能运行,也能跑 OpenJDK 和 DOOM 这类现成的 Linux 软件。图形和部分 ABI 还在补,所以只叫抢先体验。
-
-
+
+
+
+ 本页目录
+
+
+
+
+
+
+
抢先体验版,不是正式发布
+
内核已在实体服务器上启动,桌面能运行;图形和部分 ABI 还在补。
-
-
-
-
系统结构
-
-
从上到下是各层的职责;虚线是用户态和内核之间的系统调用接口。
-
- SPUI 桌面与应用 compositor · browser · terminal · filemgr · settings 等
- X11 兼容层 · VortexGlass Linux 图形软件与窗口主题
- libc · libgfx · imgui 自研的 C 库、图形库和 GUI 工具包
- Linux 6.12 系统调用 ABI 编号 0–462
- Uinxed-Kernel EEVDF 调度 · 内存 · VFS · 网络 · 驱动
- Limine 引导 UEFI 与 Legacy 双模
-
-
-
-
+ 简介
+
+ 用户态约 29.2 万行,内核约 18.1 万行,全部自研。
+ 内核实现 Linux 6.12 的系统调用 ABI(编号 0–462)。
+ 已在 Dell PowerEdge R410 等实体服务器上启动。
+ 内核仓库使用 Apache-2.0 许可。
+
-
-
-
规模
-
-
-
- 部分 规模 说明
-
-
- 用户态 约 29.2 万行SPUI 桌面、合成器、浏览器和系统程序,全部自研。
- 内核 约 18.1 万行C 写的 UNIX-like 单体内核,449 个 C/H 文件。
- 图形界面 约 3.4 万行合成器和自研图形库 libgfx。
- 浏览器 约 2.4 万行纯 C 的 UxHtml 引擎,带 JavaScript 引擎。
- 系统调用 编号 0–462 Linux 6.12 x86-64 的系统调用编号。
- 版本 / 许可 1.0.0-alpha.1 内核仓库的许可是 Apache-2.0。
-
-
-
-
-
+ 系统结构
+ 从上到下:
+
+ SPUI 桌面与应用 :合成器、浏览器、终端、文件管理器等。
+ X11 兼容层 与 VortexGlass 窗口主题。
+ 自研库 :libc、libgfx、imgui。
+ Linux 6.12 系统调用 ABI :用户态和内核的分界。
+ Uinxed-Kernel :调度、内存、VFS、网络、驱动。
+ Limine 引导 :UEFI 与 Legacy 都支持。
+
-
-
-
现成软件的运行情况
-
-
下面这些程序都不是为这个内核写的。
+
能跑的现成软件
- 程序 状态 备注
+ 程序 状态 说明
- OpenJDK 能运行为它重写了信号处理、TSS / SMP / APIC 和中断路径,并修了 VFS 与页管理。JVM 的 GC 线程、线程挂起和内存映射都依赖这些地方行为正确。
- DOOM 能运行经自研的 X11 兼容层运行。需要键盘、鼠标、连续动画帧、音频和稳定的显示通路。
- systemd 初步跑通systemd 一启动就探测大量可选的 sysctl、挂载点和命名空间接口,任何一处行为不符都会起不来。为此补了 Cgroup v2 和完整的 Linux 命名空间支持。
- Minecraft 团队实测 需要内核扛住真实 JVM 的内存管理、GC 线程调度、mmap 和 futex 行为。运行环境见页首截图。
+ OpenJDK 能运行 为它重写了信号、SMP 和中断路径。
+ DOOM 能运行 经自研的 X11 兼容层运行。
+ systemd 初步跑通 为它补了 Cgroup v2 和命名空间。
+ Minecraft 团队实测 见页首截图。
-
-
-
-
-
-
-
X11 兼容层与窗口主题
-
- X11 兼容层 从零写的 X11 服务器,实现了 120 个核心协议请求,约 4500 行。目的是让原生 SPUI 桌面直接运行 Linux 上的图形软件:窗口映射、绘制、输入与事件、字体、光标、属性与选区,缺任何一个都会让部分程序起不来。
- VortexGlass Vista Aero 风格的毛玻璃窗口装饰,在自研合成器里逐像素绘制。34 个素材覆盖四边边框、标题栏按钮的四种状态和 Aero orb。主题可以在 tech / win98 / vortexglass 之间切换,由配置服务统一管理,所有应用共用一套外观。
-
-
-
-
-
-
用户态与桌面
-
-
用户态没有套现成的发行版:从窗口合成器到浏览器都是自己写的。
-
- SPUI 桌面 约 4500 行,14 个文件。有 dock、壁纸和窗口管理;dock 上可以启动终端、开始屏幕、文件管理器、活动监视器和文本编辑器。图标缺失时有降级配色。
- 服务与配置 init / service / uxconfd。自研的 PID 1 服务管理器,有目标里程碑、进程监管与自动重启、僵尸回收。状态输出对齐 systemd 的 [ OK ] Started … 格式,提供 systemctl 风格的命令行,经 /tmp/initctl 与 PID 1 通信。配置由 uxconfd 统一管理,用 uxconf-query 读写。
- 首次开机向导 约 2100 行。思路和 PySpOS 里的向导相同:语言、时区等设置会实际生效。
- libc 与工具链 libc / libgfx / imgui:自己的 C 库、图形库和 GUI 工具包,另有自研的 sh。
+ 桌面与应用
+
+ SPUI 桌面 :dock、壁纸和窗口管理。
+ X11 兼容层 :从零写的 X11 服务器,实现 120 个核心协议请求。
+ VortexGlass :Aero 风格的毛玻璃窗口,主题可在 tech / win98 / vortexglass 间切换。
+ init :自研 PID 1,带服务监管和 systemctl 风格的命令。
+ libc / libgfx / imgui :自己的 C 库、图形库和 GUI 工具包。
- 应用
- 全部自研,不是移植来的。行数是源码规模。
+ 代码量最大的几个应用:
程序 作用 行数
- compositor 窗口合成器:DRM/KMS、损伤跟踪、Xcursor、窗口装饰 12,320
- browser 浏览器,含 UxHtml 渲染引擎与 JS 引擎 25,713
- libgfx 自研图形库与控件库 21,785
- settings 系统设置 3,064
- terminal 终端仿真器 2,869
- oobe 首次开机向导 2,137
- editor 文本编辑器 1,637
- displaymgr 显示管理器 1,489
- filemgr 文件管理器 1,347
- sysmon 活动监视器 1,267
- init PID 1 服务管理器 1,262
- uxconfd 配置守护进程 873
- netmgrd 网络管理器 761
- escalate 提权通道 685
- calc 计算器 388
+ browser 浏览器,含 UxHtml 渲染引擎和 JS 引擎 25,713
+ libgfx 图形库与控件库 21,785
+ compositor 窗口合成器 12,320
+ settings 系统设置 3,064
+ terminal 终端仿真器 2,869
-
-
-
+ 另有开机向导、编辑器、文件管理器、活动监视器、计算器等,都是自研的。
-
-
-
Uinxed-Kernel
-
-
桌面、应用和浏览器都跑在这个内核上:C 从零写的 UNIX-like x86_64 单体内核,经 Limine 引导(UEFI 与 Legacy 双模),实现 Linux 6.12 的系统调用 ABI。
-
-
-
- 调度与进程 EEVDF 调度器,每 CPU 运行队列配红黑树时间线(vruntime / deadline / vlag / weight);SMP 任务迁移与负载均衡、IPI 抢占;两阶段等待队列避免丢失唤醒;互斥量与 futex 的优先级继承;cgroups、ptrace、可加载内核模块。
- 内存管理 二元 buddy 物理页分配器,四级页表(4 KiB / 2 MiB / 1 GiB);高半区直接映射(HHDM)和 slab 分配器;统一页缓存,带 LRU 回收、脏页回写和预读;swap 子系统。
- 文件系统 UNIX 风格的 VFS,有挂载点和 inode 节点;tmpfs 作默认根,另有 procfs、sysfs、devtmpfs、cpio、cgroupfs;实际文件系统覆盖 FAT12/16/32、exFAT、ext2/3/4、NTFS(可写)和 ISO 9660。
- 网络 自研协议栈:Ethernet、ARP、IPv4/IPv6、ICMP/ICMPv6、NDP、UDP、TCP;e1000/e1000e 与 RTL8139/8169 网卡驱动;Linux 套接字 ABI、DHCP 客户端,以及 /proc/net 和 /sys/class/net 视图。
- 驱动 输入:PS/2 键鼠、evdev、USB HID。存储:IDE/ATA、AHCI、NVMe、USB Mass Storage。显示:DRM/KMS、VirtIO-GPU、GOP 帧缓冲。音频:SB16、Intel HD Audio。总线与平台:PCI/PCIe、USB、I2C、ACPI、HPET、TPM 1.2/2.0。
- 安全与 IPC seccomp 过滤和 no_new_privs;AF_UNIX / AF_NETLINK / AF_INET / AF_INET6;pipe、epoll、eventfd、timerfd、signalfd、memfd、pidfd、POSIX 消息队列和 System V IPC;futex2;inotify;Unix98 PTY 和多虚拟终端。
-
-
-
-
-
-
+ Uinxed-Kernel
+
+ 调度 :EEVDF,SMP 负载均衡,futex 优先级继承。
+ 内存 :buddy + slab,四级页表,页缓存和 swap。
+ 文件系统 :VFS;支持 FAT、exFAT、ext2/3/4、NTFS 和 ISO 9660。
+ 网络 :自研 TCP/IP 协议栈(IPv4 / IPv6),e1000 和 RTL8139/8169 网卡驱动。
+ 驱动 :USB HID、AHCI、NVMe、DRM/KMS、VirtIO-GPU、HD Audio、ACPI。
+ 安全与 IPC :seccomp、epoll、eventfd、memfd、PTY 等。
+
-
-
-
当前状态
-
-
-
-
-
实验性系统,不要用重要数据冒险
-
内核版本串是 Uinxed 1.0.0-alpha.1。请用可抛弃的机器和测试盘。
-
-
+
当前状态
+
+
+
+
实验性系统,不要拿重要数据冒险
+
请用可抛弃的机器和测试盘。NTFS 写入驱动还不能信任。
+
已经跑通
- 内核在实体服务器上启动,已验证 Dell PowerEdge R410 等机器。
- 能引导 Alpine Linux 并拉起图形桌面。Weston(Wayland)和 Xfce 两条路径都验证过,终端可用。
- SPUI 桌面和自研用户态在同一个内核上运行。
- X11 兼容层能运行 DOOM 这类图形程序,OpenJDK 能运行。
+ 在实体服务器上启动。
+ 引导 Alpine Linux 并拉起图形桌面,Weston 和 Xfce 都验证过。
+ SPUI 桌面和自研用户态。
+ DOOM 和 OpenJDK。
-
第二版的更新
-
修复 xHCI 控制器上的 USB HID,USB 键盘和鼠标可以使用。第一版镜像继续保留,详情和校验值见下载页的版本记录 。
还在做
- GPU 驱动、虚拟化设备、音频,以及相当一部分 Linux ABI。
- PS/2 输入路径、evdev 消费者、poll/epoll 唤醒和 EEVDF 调度器还在验证阶段。
- systemd 只是初步跑通,离可用还有距离。
- NTFS 写入驱动还不能信任。
+ GPU 驱动、音频和部分 Linux ABI。
+ PS/2 输入、epoll 唤醒和调度器的验证。
+ 让 systemd 真正可用。
-
-
-
+
第二版镜像修复了 xHCI 上的 USB HID,第一版仍然保留,见版本记录 。
-
-
-
构建与运行
-
-
需要 make、gcc(建议 13.3+)、qemu、xorriso;menuconfig 另需 kconfig-frontends 和 libncurses-dev。
-
在 QEMU 里运行
-
不需要额外硬件,最快能看到桌面。make run 已经把串口输出接到终端。要抓内核日志,把 limine.conf 里的 console=tty0 改成 console=ttyS0:启动挂死时屏幕控制台可能丢日志,串口更可靠。
-
在实体机上运行
-
已在 Dell PowerEdge R410 上验证。先看仓库 README 的 Run on physical hardware 一节,按步骤准备引导介质。请用可抛弃的机器和测试盘;文件系统驱动(尤其是 NTFS 写入)目前不适合放重要数据。
-
源码 · 配置要求 · 下载镜像
-
+
构建与运行
+
需要 make、gcc(建议 13.3+)、qemu 和 xorriso。
+
+ QEMU :make run,串口输出直接到终端。要抓内核日志,把 limine.conf 里的 console=tty0 改成 console=ttyS0。
+ 实体机 :按仓库 README 的 Run on physical hardware 一节准备引导介质。
+
+
内核源码 · 配置要求 · 下载镜像
+
@@ -343,7 +272,7 @@
-
+
diff --git a/docs/spaceos9-download.html b/docs/spaceos9-download.html
index cc763ae..533bbf6 100644
--- a/docs/spaceos9-download.html
+++ b/docs/spaceos9-download.html
@@ -7,7 +7,7 @@
下载 SpaceOS 9 | GoutouStdio
-
+
@@ -232,7 +232,7 @@
-
+
diff --git a/docs/spaceos9.html b/docs/spaceos9.html
index 61436be..1c0da4b 100644
--- a/docs/spaceos9.html
+++ b/docs/spaceos9.html
@@ -7,7 +7,7 @@
SpaceOS 9 | GoutouStdio
-
+
@@ -81,7 +81,7 @@
公开预览
SpaceOS 9
-
内核是 Rust 写的 SpaceKernel 3.0,实现了 Linux 64 位 ABI,目标是让现成的 Linux 程序直接运行。目前验证过的是 musl 动态链接的 BusyBox。镜像是 x86_64 的可启动 ISO。
+
内核 SpaceKernel 3.0 用 Rust 写成,实现 Linux 64 位 ABI,目标是直接运行现成的 Linux 程序。目前验证过 musl 动态链接的 BusyBox。
-
-
-
-
-
-
-
这是公开预览
-
内核自测、三个架构的编译检查和 QEMU 启动已经通过;用户态和驱动覆盖还在补。下载前请读使用声明 。
-
-
+
+
+
+ 本页目录
+
+
+
+
+
+
+
这是公开预览
+
内核自测、三个架构的编译检查和 QEMU 启动已经通过,用户态和驱动还在补。下载前请读使用声明 。
-
-
-
-
-
启动顺序
-
在 QEMU / UEFI 上的启动流程,每一步对应镜像里的一个组件。
-
-
- 1
UEFI 固件
QEMU 里由 OVMF 提供,从 ISO 启动引导程序。
- 2
Limine
引导内核,并把 FAT32 的 rootfs 作为模块交给它。
- 3
SpaceKernel 3.0
初始化后只读挂载根盘,再启动 PID 1。
- 4
systemg
作为 PID 1,按依赖顺序启动 .service 里定义的服务。
- 5
ash
控制台 shell。退出后由 systemg 重新拉起。
-
-
-
+ 组成
+
+ 内核 :SpaceKernel 3.0,Rust、soft-float,x86_64 优先。
+ ABI :Linux 64 位,支持 ELF / PIE / 动态链接、信号、futex、epoll、AF_UNIX。
+ 根盘 :FAT32,由 Limine 模块提供,只读挂载。
+ PID 1 :systemg,按依赖启动服务并回收进程。
+ 用户态 :自带 C 库 splibc 和 sh;BusyBox 通过 musl 动态链接运行。
+ 终端 :ash,支持作业控制和 Ctrl-C / Ctrl-Z。
+
+
+ 启动顺序
+
+ UEFI 固件(QEMU 里是 OVMF)从 ISO 启动引导程序。
+ Limine 加载内核,并把 FAT32 根盘作为模块交给它。
+ SpaceKernel 初始化,只读挂载根盘,启动 PID 1。
+ systemg 按 .service 的依赖启动服务。
+ 拉起控制台 shell ash;退出后由 systemg 重启。
+
+
+ 这一版新增
+
+ VFS 缓存 :Linux 语义的 dentry / inode 缓存和 LRU 回收;FAT32 大文件读取加了簇链缓存。
+ 动态链接 :内核装载 ELF 解释器和 PIE,能运行 musl 动态链接的 BusyBox。
+ 进程与信号 :线程、进程组与会话、POSIX 信号、futex、epoll、signalfd、timerfd。
+ 终端 :控制终端、前后台进程组和 raw 模式。
+
-
-
-
组成
-
-
SpaceOS 9 没有另造一套用户接口,而是尽量把 Linux 现有的进程、文件和终端语义做完整,让现成程序能直接运行。
+
验证情况
+
+ 范围 状态 说明
+
- 内核 SpaceKernel 3.0。Rust、soft-float、多架构,x86_64 优先。
- ABI Linux 64 位:ELF / PIE / PT_INTERP、系统调用、信号、futex、epoll、AF_UNIX。
- 根盘 FAT32。Limine 模块提供 rootfs,只读挂载;有 /dev、/proc、/sys、/tmp、/run。
- PID 1 systemg:服务单元、依赖排序、SIGCHLD 回收与重启。
- 用户态 splibc(freestanding C 库)、sh、systemg。动态链接的 BusyBox 通过 musl 运行。
- 终端 ash,带作业控制:raw termios、poll、控制终端、前台进程组、Ctrl-C / Ctrl-Z。
+ x86_64 已验证 QEMU / UEFI 启动、systemg、BusyBox 动态加载、ash 交互和内核自测。
+ aarch64 / riscv64 仅编译检查 用户态和启动链路未验证。
+ 真实硬件 未验证 只在 QEMU 的 VirtIO GPU 2D 上测过。
-
-
-
-
-
-
这一版新增的部分
-
- VFS 缓存 Linux 语义的 dentry / inode 缓存:正、负 dentry,inode 身份,LRU 回收,路径前缀失效。procfs、sysfs、devtmpfs 每次都重新验证,避免设备注销后还查到旧目录。FAT32 的大文件读取另外做了簇链缓存。
- 动态链接与 BusyBox 内核装载 ELF 解释器和 PIE。镜像里有 musl 动态加载器和 BusyBox standalone shell;ash 能接收键盘和串口输入,并执行 applet。
- 进程、信号与终端 clone 线程、进程组与会话、wait4 / waitid、POSIX 信号、futex、epoll、signalfd、timerfd、AF_UNIX。终端支持控制终端、前后台进程组和 raw 模式。
- 从 PID 1 到 shell systemg 作为 PID 1,解析 /etc/systemg/*.service,按依赖启动服务、回收孤儿进程,并拉起控制台 shell。splibc 提供静态 C 运行环境和自带的 sh。
-
-
-
-
-
-
-
验证情况
-
-
-
- 范围 状态 内容
-
-
- x86_64 已验证UEFI/QEMU 启动、systemg 作 PID 1、BusyBox 动态加载、ash 交互、uname / id / nproc / ls / cat、VFS dcache 自测、SELFTEST_OK,以及三个架构的 cargo check。
- aarch64 / riscv64 仅编译检查内核能通过编译检查。用户态、rootfs 和启动链路没有在这个镜像里验证。
- 真实硬件与 GPU 未验证目前只在 QEMU 的 VirtIO GPU 2D 上验证。真实 GPU、音频、网络、睡眠唤醒不在这个镜像的承诺范围内。
-
-
-
-
-
-
-
@@ -245,7 +215,7 @@
-
+