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. -
    1
    -

    Shell:parse → dispatch

    -

    Shell 把输入解析成命令和参数,再交给对应的模块。管道、重定向和后台作业都从这里开始。

    - src/shell/dispatch.py -
  2. -
  3. -
    2
    -

    进程:fork → exec

    -

    外部应用通过 fork / exec 运行,是独立的进程。调度器用虚拟运行时间和截止期安排执行。

    - src/forkexec.py · src/process.py -
  4. -
  5. -
    3
    -

    运行时:execute → syscall

    -

    ELF 由 Unicorn 执行 x86_64 指令,系统调用转发到内置的模拟层。可以观察执行、改实现,再运行一次。

    - Unicorn Engine → syscall -
  6. -
-
-
+

一条命令怎么执行

+
    +
  1. Shell:解析输入并分发给对应模块。管道、重定向和后台作业从这里开始。
  2. +
  3. 进程:外部程序经 fork / exec 成为独立进程,由调度器安排运行。
  4. +
  5. 运行时:Unicorn 执行 ELF 指令,系统调用转给内置的模拟层。
  6. +
-
-
-

概览

-
-

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
-
-
-
-
-
-

兼容性

-
-
- - - - - - - -
WindowsWindows 7 及以上,兼容性最好
Linux主流发行版(Ubuntu、Debian、Fedora 等)
macOSmacOS 10.14 及以上
Python3.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 就能跑。

+
+
+ + + - - - - - - + + + + + + +
项目最低配置推荐配置
Python3.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 和精简容器镜像需要)。都不是硬性要求。
Python3.103.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 QEMUx86_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_64x86_64 多核(支持 SMP)
内存128 MB1 GB 以上(图形桌面 + swap)
固件UEFI 或 Legacy BIOSUEFI(已验证)
显示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 介绍。

-
-
-

SpaceOS 6 / 7

-
-

这两个项目已停止开发,这里不再列硬件要求。页面仅作历史存档,配置和构建说明以当时的仓库记录为准。

-

SpaceOS 7 存档 · SpaceOS 6 存档

-
+

SpaceOS 6 / 7

+

已停止开发,不再列配置要求。见 SpaceOS 7 和 SpaceOS 6 存档页。

+
@@ -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

-
-
-
- -
-

这个项目已停止开发,本页仅作存档

-

不再维护,不接受 issue、功能请求或移植,请不要基于它继续投入。目前在维护的是 PySpOS 和 SpaceOS 9;PySpOS 的代码在 ViudiraTech/PySpOS。

- -
+
+
+ +
+
+ +
+

这个项目已停止开发,本页仅作存档

+

不再维护,不接受 issue 或功能请求。目前在维护的是 PySpOS 和 SpaceOS 9。

-
-
-
-

背景

-
-

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

-
-
-
- -
-

这个项目已停止开发,本页仅作存档

-

不再维护,不接受 issue、功能请求或移植,请不要基于它继续投入。目前在维护的是 PySpOS 和 SpaceOS 9;PySpOS 的代码在 ViudiraTech/PySpOS。

- -
-
-
-
- -
-
-

背景

-
-

2026 年,团队研究清楚 UEFI 之后启动了这个项目:没有外部代码,没有依赖,UEFI 引导和内核加载全部自己写。设计目标写的是“完全自研、混合内核、极致性能”,混合内核想兼顾微内核的稳定和宏内核的性能。

-

做到约一半时停止:用户态没做完,还存在 Heisenbug。中间重构过一次引导和内核;桌面环境运行在 Ring 3,桌面崩溃不会拖垮内核。

+
+
+ +
+
+ +
+

这个项目已停止开发,本页仅作存档

+

不再维护,不接受 issue 或功能请求。目前在维护的是 PySpOS 和 SpaceOS 9。

-
-
-
-

做到的部分

-
    -
  • 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 和权限接口。
  • +
-
-
-

进展

-
    -
  1. 搞懂 UEFI

    理解 UEFI 之后,启动完全自研的操作系统项目。(用户态没做好)

  2. -
  3. 混合内核设计

    完成混合内核的架构设计。

  4. -
  5. 内核实现

    完成内核基本功能:进程调度、内存管理、中断处理。

  6. -
  7. Ring 3 桌面

    实现用户空间的桌面环境。

  8. -
+

进展

+
    +
  1. 搞懂 UEFI,启动项目。
  2. +
  3. 完成混合内核的架构设计。
  4. +
  5. 实现调度、内存管理和中断处理。
  6. +
  7. 实现 Ring 3 桌面,之后停止。
  8. +
+
@@ -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 键盘和鼠标。

下载第二版镜像 内核源码 @@ -94,205 +94,134 @@

SpaceOS 8

Minecraft 在 Weston 桌面中运行的截图,世界完整渲染,生命值、饥饿条、快捷栏和准星都正常 -
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)。
-
-
- -
- -
-

抢先体验版,不是正式 release

-

内核已在实体服务器上启动,桌面能运行,也能跑 OpenJDK 和 DOOM 这类现成的 Linux 软件。图形和部分 ABI 还在补,所以只叫抢先体验。

- -
+
+
+ +
+
+ +
+

抢先体验版,不是正式发布

+

内核已在实体服务器上启动,桌面能运行;图形和部分 ABI 还在补。

-
-
-
-

系统结构

-
-

从上到下是各层的职责;虚线是用户态和内核之间的系统调用接口。

-
    -
  1. SPUI 桌面与应用compositor · browser · terminal · filemgr · settings 等
  2. -
  3. X11 兼容层 · VortexGlassLinux 图形软件与窗口主题
  4. -
  5. libc · libgfx · imgui自研的 C 库、图形库和 GUI 工具包
  6. -
  7. Linux 6.12 系统调用 ABI编号 0–462
  8. -
  9. Uinxed-KernelEEVDF 调度 · 内存 · VFS · 网络 · 驱动
  10. -
  11. Limine 引导UEFI 与 Legacy 双模
  12. -
-
-
-
+

简介

+
    +
  • 用户态约 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–462Linux 6.12 x86-64 的系统调用编号。
版本 / 许可1.0.0-alpha.1内核仓库的许可是 Apache-2.0。
-
-
-
+

系统结构

+

从上到下:

+
    +
  1. SPUI 桌面与应用:合成器、浏览器、终端、文件管理器等。
  2. +
  3. X11 兼容层与 VortexGlass 窗口主题。
  4. +
  5. 自研库:libc、libgfx、imgui。
  6. +
  7. Linux 6.12 系统调用 ABI:用户态和内核的分界。
  8. +
  9. Uinxed-Kernel:调度、内存、VFS、网络、驱动。
  10. +
  11. Limine 引导:UEFI 与 Legacy 都支持。
  12. +
-
-
-

现成软件的运行情况

-
-

下面这些程序都不是为这个内核写的。

+

能跑的现成软件

- + - - - - + + + +
程序状态备注
程序状态说明
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
    initPID 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。
安全与 IPCseccomp 过滤和 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。

下载预览镜像 查看源码 @@ -99,102 +99,72 @@

SpaceOS 9

-
-
- -
- -
-

这是公开预览

-

内核自测、三个架构的编译检查和 QEMU 启动已经通过;用户态和驱动覆盖还在补。下载前请读使用声明。

- -
+
+
+ +
+
+ +
+

这是公开预览

+

内核自测、三个架构的编译检查和 QEMU 启动已经通过,用户态和驱动还在补。下载前请读使用声明。

-
-
-
-
-

启动顺序

-

在 QEMU / UEFI 上的启动流程,每一步对应镜像里的一个组件。

-
-
    -
  1. 1

    UEFI 固件

    QEMU 里由 OVMF 提供,从 ISO 启动引导程序。

  2. -
  3. 2

    Limine

    引导内核,并把 FAT32 的 rootfs 作为模块交给它。

  4. -
  5. 3

    SpaceKernel 3.0

    初始化后只读挂载根盘,再启动 PID 1。

  6. -
  7. 4

    systemg

    作为 PID 1,按依赖顺序启动 .service 里定义的服务。

  8. -
  9. 5

    ash

    控制台 shell。退出后由 systemg 重新拉起。

  10. -
-
-
+

组成

+
    +
  • 内核: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。
  • +
+ +

启动顺序

+
    +
  1. UEFI 固件(QEMU 里是 OVMF)从 ISO 启动引导程序。
  2. +
  3. Limine 加载内核,并把 FAT32 根盘作为模块交给它。
  4. +
  5. SpaceKernel 初始化,只读挂载根盘,启动 PID 1。
  6. +
  7. systemg 按 .service 的依赖启动服务。
  8. +
  9. 拉起控制台 shell ash;退出后由 systemg 重启。
  10. +
+ +

这一版新增

+
    +
  • 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 优先。
ABILinux 64 位:ELF / PIE / PT_INTERP、系统调用、信号、futex、epoll、AF_UNIX。
根盘FAT32。Limine 模块提供 rootfs,只读挂载;有 /dev、/proc、/sys、/tmp、/run。
PID 1systemg:服务单元、依赖排序、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、音频、网络、睡眠唤醒不在这个镜像的承诺范围内。
-
-
-
- -
-
-

源码与许可

-
-

SpaceOS 9 的源码在 ViudiraTech/SpaceOS-9。镜像里包含 BusyBox、musl、Limine 等第三方组件,各自遵循自己的许可证,许可与源码获取方式见下载页和 THIRD_PARTY_NOTICES.md。

- -
+

源码与许可

+

源码在 ViudiraTech/SpaceOS-9。镜像里的 BusyBox、musl、Limine 等组件各有许可,见 THIRD_PARTY_NOTICES.md。

+

下载 SpaceOS 9 · 上一代:SpaceOS 8

+
@@ -245,7 +215,7 @@
- +