豫言 / 豫言裸机 @ 0.1.0

从标准网页汇编整数模块直接生成裸机用户态验证镜像。

源码浏览已生成;不能解析的文件以纯文本展示,不表示通过类型检查。

说明.汉语.md

# 豫言双架构裸机原型

## 当前系统总览(先看这里)

豫言操作系统现在是一个可以启动、可以交互、有持久文件系统的单核系统,ARM64 与 AMD64 都在 QEMU 里通过自动验收:

| 层 | 内容 | 文档 |
|---|---|---|
| 内核 | 手写机器码(由豫言源生成):页权限隔离、定时抢占、两个任务槽的创建/等待/终止/回收/复制、单条整数消息邮箱与阻塞接收、动态内存块(线性内存可增长)、设备窗口与 IOMMU 隔离、Virtio 设备的用户态访问、控制台输入环与 Ctrl-C 标志、实时钟([墙钟服务](文档/墙钟服务.汉语.md):ARM64 读 PL031、AMD64 读 CMOS) | 本目录各专题文档 |
| 用户态执行器 | `客体二号`:用底层模式的普通豫言写成的 WasmGC 解释器(栈机、保守标记清扫回收、异常、尾调用、软浮点);在用户态运行普通豫言程序 | [客体二号](文档/客体二号.汉语.md) |
| 文件系统 | 用户态 Virtio 块驱动 + 双区追加日志的持久文件系统(多层目录、崩溃安全的提交扇区、紧缩),离线造盘工具 `yy造盘` | [客体二号](文档/客体二号.汉语.md)、[文件系统提交日志](文档/文件系统提交日志.汉语.md) |
| 壳 | 普通豫言写的默认命令壳(`壳/壳。豫`):目录、切换、列、读、写、追加、复制、移动、建、删、运行、脚本、加、回显、设、取消、环境;命令输出可用 `>`、`>>` 写入文件,`运行` 可用 `< 文件` 重定向标准输入、`甲 \| 乙 \| 丙` 串成顺序管道;子进程里也能读写文件(由壳代办);Ctrl-C 打断正在运行的程序(退出码 130)、放弃正在敲的一行([控台输入](文档/控台输入.汉语.md))| [客体二号](文档/客体二号.汉语.md) 的验收一节 |
| 进程 | 同步子进程:复制任务,子任务把磁盘上的程序换进执行器,父任务等待退出码;标准输入重定向、环境变量随复制交给子任务 | 同上“子进程”“标准输入重定向、环境变量与顺序管道”两节 |
| 动态装载 | 多实例:运行中从盘上装载 Wasm 模块,跨模块导入导出与双向回调(含延迟链接) | 同上“多实例”一节 |
| 数值 | 小数运算走 IEEE 754 软浮点(加减乘除、转换、定点六位转串、%.17g 精确表示、串转小数);Wasm 的 f32/f64 全部指令(比较、算术、取整、开方、转换、饱和截断)同样由软浮点实现,逐位对照 V8 | 同上“软浮点”“Wasm 浮点指令”两节 |

**构建并运行**(在仓库根目录、已安装 QEMU 时):

```sh
node 豫言操作系统/宿主/节点/宿主.cjs yy豫构.wasm 文件 豫言操作系统/裸机/豫言系统。豫 --编译器 ./yy4_bs.wasm --输出 yy豫言系统.wasm
YY_GC_INITIAL_HEAP_SIZE_MB=1024 node 豫言操作系统/宿主/节点/宿主.cjs yy豫言系统.wasm 运行 --架构 兼容六十四      # 交互;缺省带上示例程序;壳里输入“退出”结束,Ctrl-C 打断运行中的程序,卡死时按 Ctrl-A 再按 X 强制结束
YY_GC_INITIAL_HEAP_SIZE_MB=1024 node 豫言操作系统/宿主/节点/宿主.cjs yy豫言系统.wasm 构建 --预置 某目录树       # 只造镜像与盘并打印 QEMU 命令
```

`--预置` 缺省就是 `豫言操作系统/裸机/示例`(写 `--预置 无` 得空盘),它指向的目录树整棵放进盘里(盘缺省 65536 个扇区即 32 MiB,`--盘容量` 可改);树里以 `。豫` 结尾的文件先编成程序(`/程序/你好。豫` 成 `/程序/你好.wasm`),以 `.底层库` 结尾的标记文件构建同名底层包(`/库/库甲.底层库` 成 `/库/库甲.wasm`),壳里用 `运行 /程序/你好.wasm 参数…` 启动,普通豫言程序可用 `豫言_加载模块`/`豫言_调用导出` 装载并调用库。用法见 `豫言操作系统/裸机/豫言系统。豫`;可运行的示例程序(你好、回声、质数、斐波那契、统计、复制文件、行数、环境变量)见 [示例](文档/示例.汉语.md)。

**验收**:

```sh
node 豫言操作系统/宿主/节点/宿主.cjs yy豫构.wasm 文件 豫言操作系统/裸机/普通豫言验证。豫 --编译器 ./yy4_bs.wasm --输出 yy普通豫言验证.wasm
YY_GC_INITIAL_HEAP_SIZE_MB=1024 node 豫言操作系统/宿主/节点/宿主.cjs yy普通豫言验证.wasm                       # 42 项 × 双架构,约 12 分钟;--只验 普通-壳- 只跑一类
```

覆盖:普通豫言程序(打印、列表、闭包、异常、回收压力、小数、浮点指令、表指令)、壳(基本、文件命令、运行子进程、子进程的文件、输出重定向、脚本、示例程序、环境变量与管道、子程序崩溃隔离、磁盘上的大程序)、语言测试集 `应用/豫言编译器/测试/网页汇编` 的十二例、磁盘(跨重启读写、离线造盘)、动态装载(含回收压力)、内核服务探针。内核本身另有一套 `yy裸机验证`(下文,三百余项)。

普通豫言壳在拆词前去掉行模式读入所含的末尾换行,使命令参数和 `退出` 恢复准确解析。交互就绪与模拟器完成的旧等待上限已各放大一百倍,便于检查较长的壳测试;`--只验 壳-基本`、`--只验 壳-运行`、`--只验 壳-子进程文件` 在双架构 QEMU 通过。验证器仍按输出与期望逐字比较。

**WASI**:WASI preview1 兼容层由 `客体二号/WASI名称。豫` 与 `WASI分派。豫` 部分接入,旧实现保存在 [WASI库](WASI库/说明.汉语.md) 供参考。22 个样例各至少在一个原生目标运行过;裸机子任务的随机数熵源与底层文件代办仍待实现。

**当前限制**:内核只有两个任务槽,所以一次只能有一个子进程、子进程不能再起子进程,管道也只能是顺序的(各段一个接一个运行,前一段必须自己结束);子进程的文件操作由初始任务经邮箱代办(每条消息三个字节,量大很慢);实时钟只有秒的精度与 UTC;跨实例只传数值;没有 SIMD。

已实现 ARM64、AMD64 的 QEMU 裸机启动验证。标准 Wasm 整数核心模块经过自有提前编译后,在真实用户态执行;最小特权核心提供页权限、同步异常入口、定时中断和受控服务。机器字节、重定位、启动头和页表全部由豫言生成,没有汇编源文件,也不调用外部汇编器或链接器。

内核是单核微内核:两任务池的运行时创建、等待、终止、回收、复制及消息通信,见[双任务调度](文档/双任务调度.汉语.md);不指定输入模块时,生成的镜像默认启动早期的整数命令壳([用户命令壳](文档/用户命令壳.汉语.md))。以下各节描述内核的最小验证器 `yy裸机验证`:直接把标准 Wasm 整数模块提前编译成机器码运行,不经用户态执行器。普通豫言程序(完整 WasmGC)、持久文件系统、以普通豫言写的壳、子进程与动态装载都在用户态执行器 `客体二号` 上,见上文总览,各阶段实测证据见验证记录。

## 一条命令验证

在仓库根目录、安装 QEMU 后运行:

```sh
node 豫言操作系统/宿主/节点/宿主.cjs yy豫构.wasm 文件 豫言操作系统/裸机/验证。豫 --编译器 ./yy4_bs.wasm --输出 yy裸机验证.wasm -j 24
YY_GC_INITIAL_HEAP_SIZE_MB=1024 node --no-liftoff 豫言操作系统/宿主/节点/宿主.cjs yy裸机验证.wasm
```

验证器使用豫言异步子进程,每项约三十秒等待预算;超时按本轮独立进程号文件终止模拟器。全部镜像、输入模块和串口日志保存到新建临时目录,最后打印路径。测试用到宿主的 `mktemp`、`dd` 和 `/bin/kill`;`dd` 只用于负对照改动页表或中断标志,不参与正常镜像生成。

2026-09-28 在 Node 26.3.0 上,`--no-liftoff` 使体积很大的「客体整数执行」夹具直接经优化编译器编译,避开 Liftoff 对单个函数的代码空间限制;上述命令的 380 项双架构验证全部通过,运行约 80 秒。

最初的六项基础检查如下;当前验证器另包含定时器、抢占、结构控制、存储、算术及外部模块等扩展用例,具体数量由运行结果计算:

| 检查 | 客体必须发生的行为 |
|---|---|
| 正常 | 在用户态完成函数调用、局部更新、溢出回绕及乘法核验,然后正常退出 |
| 隔离 | 完成同样核验后,读取内核私有页,产生权限异常;核心核对异常来源及地址 |
| 错误结果 | 将预期四十二改为四十三,核心必须报失败 |
| 放开权限 | 只改受测页表的用户访问位;探测不再陷入,验证必须报失败 |
| 操作数栈越界 | 保持 Wasm 类型正确,压入超过客体栈限额的值;运行时必须报失败 |
| 调用栈越界 | 有效模块进入递归,调用帧越界前必须报失败 |

检查同时匹配退出码和串口文字;负对照禁止出现成功标记。AMD64 使用模拟退出设备:通过退出码为三十三,拒绝为三十五。ARM64 使用半主机退出:通过为零,拒绝为一。串口输出都来自客体实际访问设备;退出机制仅用于结束模拟,不承担程序计算或打印。

## 单独生成镜像

```sh
node 豫言操作系统/宿主/节点/宿主.cjs yy3_bs.wasm 豫言操作系统/裸机/入口。豫 -o yy豫言裸机.wasm
node 豫言操作系统/宿主/节点/宿主.cjs yy中文网页汇编.wasm 编码 豫言操作系统/裸机/启动验证.网页汇编。豫 yy裸机客体.wasm
node 豫言操作系统/宿主/节点/宿主.cjs yy豫言裸机.wasm 臂六十四 yy裸机客体.wasm yy臂正常.elf 正常
node 豫言操作系统/宿主/节点/宿主.cjs yy豫言裸机.wasm 兼容六十四 yy裸机客体.wasm yy兼容正常.img 正常
```

末参数可改为「隔离」,生成附带用户态内核页读取探针的验证镜像。探针是平台验证桩,不是私有 Wasm 指令。正常镜像不包含该探针。生成器只编译输入,不预先运行输入程序;计算结果在模拟的 CPU 上形成。

ARM64:

```sh
qemu-system-aarch64 -machine virt,gic-version=2,virtualization=off,secure=off \
  -cpu cortex-a53 -accel tcg -m 128M -smp 1 -display none -monitor none \
  -serial stdio -no-reboot -semihosting-config enable=on,target=native \
  -kernel yy臂正常.elf
```

AMD64:

```sh
qemu-system-x86_64 -machine pc -accel tcg -m 128M -smp 1 \
  -display none -monitor none -serial stdio -no-reboot \
  -device isa-debug-exit,iobase=0xf4,iosize=0x04 -kernel yy兼容正常.img
```

正常串口输出:

```text
豫言核心启动
用户程序已运行
用户态计算验证通过
```

## 模块契约与实现边界

输入必须导出无参数、无结果的「启动」。只允许以下函数导入,名字和签名均检查:

| 模块与名称 | 参数、结果 | 实现 |
|---|---|---|
| 平台/写字节 | 一个三十二位整数,无结果 | 经系统调用访问串口,检查字节范围 |
| 平台/核验 | 两个三十二位整数,无结果 | 比较实值与期值,失败立即停止验证 |
| 平台/用户态 | 无参数,一个三十二位结果 | 核心先检查保存的硬件用户态状态,才返回一 |
| 平台/读字节 | 无参数,一个三十二位结果 | 非阻塞读取串口,无数据返回负一 |
| 平台/时钟滴答 | 无参数,一个三十二位结果 | 返回已处理的定时中断计数 |
| 平台/任务编号 | 无参数,一个三十二位结果 | 返回当前静态任务编号 |
| 平台/任务状态 | 一个三十二位参数、一个三十二位结果 | 查询运行状态位,无效编号返回负一 |

当前启动验证协议要求正常结束前恰好完成四次核验;这属于测试协议,不是通用系统调用标准。不能将这些宿主接口误称为 WAT 规定的操作系统接口:模块导入及类型是标准的,平台服务语义由本项目定义。

函数参数、结果置于独立的非 GC 操作数栈,局部变量置于真实调用帧。两套后端均支持整数核心的所有现有指令。操作数栈限一百二十八千字节,调用栈约一百二十八千字节,二者有间隔;压值和分配调用帧时检查边界,超限进入失败路径。函数参数与附加局部合计至多一百二十八项;用户代码至多一兆字节。尚未做寄存器分配或跨函数栈检查消除。

ARM64 以自有 ELF64 头装载,在一级异常层安装页表和异常向量,通过异常返回进入零级用户态。AMD64 以多重引导首版地址头装载,从三十二位保护模式切换到六十四位长模式,安装页表、全局描述符、任务状态段及中断门,再进入第三特权环。QEMU 提供镜像装载入口;尚无磁盘启动扇区或实机固件移植。

两端采用静态两兆字节页映射。AMD64 核心位于低两兆,用户域位于二至四兆;ARM64 核心位于 `0x40000000` 区域,用户域位于 `0x40200000`,另有 `0x40400000` 私有受测页。串口只由特权核心访问。用户代码与用户栈尚在同一可读写用户映射中,未实现页级写入/执行互斥;这些限制不影响当前内核页隔离检查,但还不足以成为不可信程序的生产沙箱。

镜像生成阶段可以在无工具搜索路径时运行。生成器自身目前仍由既有豫言编译器构建;通过 Wasm 执行生成器也仍借助现有宿主。不能把客体无外部编译器与库依赖等同于整个自举工具链已经独立。

## 代码与规范

- `豫言操作系统/裸机/库/裸机后端/机器编码。豫`:字节序、两遍标号解析和重定位。
- `整数降级。豫`:标准整数模块验证、函数提前编译和平台导入桩。
- `臂核心。豫`、`兼容核心。豫`:平台启动、保护状态、异常和镜像装配。
- `任务上下文。豫`、`任务调度。豫`:统一整数帧和静态任务切换。
- `验证。豫`:双架构正常及负对照回归。

规范依据:[QEMU 臂虚拟平台](https://www.qemu.org/docs/master/system/arm/virt.html)、[多重引导地址头](https://www.gnu.org/software/grub/manual/multiboot/html_node/Header-address-fields.html)、[Intel 系统与指令手册](https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html)、[Arm 异常层切换说明](https://developer.arm.com/community/arm-community-blogs/b/tools-software-ides-blog/posts/changing-exception-level-and-security-state-with-an-armv8a-fixed-virtual-platform)。本次环境版本及验证记录见同目录验证稿。

已新增用户态结构化分支、循环、跳转和返回,双架构二十项裸机检查通过,详[结构控制](文档/结构控制.汉语.md)。后续定时中断和抢占进展见[定时中断](文档/定时中断.汉语.md)与[双任务调度](文档/双任务调度.汉语.md)。

新增非阻塞控制台读字节,双架构二十四项验证通过,详[控制台输入](文档/控制台输入.汉语.md)。

最新已接入双任务的用户故障退出与退出码查询,见[故障隔离](文档/故障隔离.汉语.md)。当前双架构验收为 138 项(包含可选外部 C 模块);该报告亦记录了避免旧宿主编译缓存误验的冷构建方法。

阻塞等待和退出唤醒已接入,最新双架构 148 项通过,见[阻塞等待](文档/阻塞等待.汉语.md)。

新增受所有权约束的任务终止,双架构 154 项通过,详[主动终止](文档/主动终止.汉语.md);动态创建和资源回收仍待实现。

已接入运行时任务复制,双架构 160 项通过,详[运行时创建](文档/运行时创建.汉语.md)。当前是单槽静态内存池,尚无动态模块加载和资源复用。

当前已完成固定任务池中的创建、等待、终止、回收与安全复用,双架构 172 项通过,详[任务回收](文档/任务回收.汉语.md)。通用多任务分配、IPC、动态程序加载、Shell 和持久化文件系统继续按总目标推进。

已加入受所有权和代际句柄约束的双向整数消息邮箱,双架构 180 项通过,详[任务通信](文档/任务通信.汉语.md)。接收暂为非阻塞,后续继续扩展用户态服务所需能力。

阻塞消息接收、唤醒与对端退出处理已通过验收,双架构共 192 项,详[阻塞通信](文档/阻塞通信.汉语.md)。通用调度、字节传输和用户态服务仍继续推进。

**默认镜像生成入口现为常规运行。** 省略第四参数或使用“运行”即可运行不含测试核验的程序;“正常”“隔离”仍保留旧验收含义。常规退出与完整退出码传递详[常规运行](文档/常规运行.汉语.md),双架构 210 项通过。这不是完整高级豫言或 WasmGC 的运行支持。
当前 IOMMU 工作已扩展到用户线性内存的连续页映射:首部、末部、上界、只读保护和用户态可见性均通过两架构验收,完整回归共 262 项。详[用户设备内存](文档/用户设备内存.汉语.md)。默认用户态 Shell 已具备任务交互;生产 Virtio 块驱动、文件持久化、动态执行器和 WasmGC 仍未完成。
用户态 Virtio 寄存器访问和“设备驱动”构建方式已接入,两架构完整回归共 268 项通过,详[用户设备寄存器](文档/用户设备寄存器.汉语.md)。设备初始化与内存授权由内核控制,用户程序已能协商特性并配置队列;磁盘队列传输、退出清理和文件持久化尚未完成。
用户态 Virtio 块读写、显式刷新与跨 QEMU 启动的数据保留已通过两架构验收,完整回归共 280 项,详[用户磁盘读写](文档/用户磁盘读写.汉语.md)。文件目录、Shell 文件命令和设备服务进程化仍待实现。
文件系统的用户态提交日志已通过两架构恢复、未完成尾部、损坏拒绝和容量边界验证,完整回归共 294 项,详[文件系统提交日志](文档/文件系统提交日志.汉语.md)。目录、文件名、删除、空间回收和 Shell 文件命令尚未完成。
用户态文件目录已支持创建、嵌套目录、查找枚举、内容替换、分段读取和删除,跨启动保持句柄代际,完整回归共 308 项。详[用户文件目录](文档/用户文件目录.汉语.md)。Shell 文件命令、独立文件服务与日志磁盘空间回收仍待实现。
默认用户态 Shell 现已接入文件、目录、路径与显式格式化命令,同时保留任务及输入处理,完整回归共 314 项。详[命令壳文件操作](文档/命令壳文件操作.汉语.md)。日志空间回收、独立文件服务、动态程序加载和 WasmGC 仍待完成。
设备持有者的自然、显式、陷阱和硬件缺页退出现已执行内核授权撤销、复位与 IOMMU 清理;子任务结束不误撤父设备。完整回归共 326 项,详[设备退出清理](文档/设备退出清理.汉语.md)。随机在途压力、一般资源池、磁盘空间回收、动态加载和 WasmGC 仍待完成。

客体用户态的有界字节读取与三十二位变长整数解码已通过两架构验证,完整回归共 328 项;另以独立标准 Wasm 引擎验证并执行新增用例。详[客体字节读取](文档/客体字节读取.汉语.md)。这只是动态加载的读取基础,尚未接入默认 Shell,不代表模块验证、动态执行或 WasmGC 已完成。

客体模块头、区段顺序与边界、UTF-8 名字和选段隔离已通过两架构测试,完整回归共 330 项。详[客体模块区段](文档/客体模块区段.汉语.md)。索引仅描述区段位置,段内容、指令和实例化仍待验证与实现,尚不能加载执行外部程序。

客体整数函数索引已支持类型、函数导入、定义、局部声明、导出和启动签名检查,完整回归共 332 项。详[客体函数索引](文档/客体函数索引.汉语.md)。代码仍待指令验证,非函数资源也尚未解析完整;索引成功不会授予执行许可。

客体内存、全局与数据段读取及独立工作区初置已通过两架构验收,完整回归共 334 项。详[客体资源初置](文档/客体资源初置.汉语.md)。初置检查全部主动段后才复制数据;尚不执行函数,完整指令验证、实例化与动态执行仍待实现。

客体 i32 函数体已可解码为指令记录,检查结构与立即数并回填条件出口,完整回归共 336 项。详[客体指令解码](文档/客体指令解码.汉语.md)。操作数栈验证与执行循环尚未实现,解码完成不授予执行许可。

客体 i32 函数体的操作数与控制栈验证已通过两架构验收,完整回归共 338 项。详[客体操作数栈](文档/客体操作数栈.汉语.md)。四十四个模块预期与标准验证器一致;执行循环、运行时陷阱、模块全验和动态运行仍待完成。

用户态整数解释器已真正运行标准模块的控制、算术和直接调用,循环求和与递归阶乘均由客体算出,完整回归共 340 项。详[客体整数执行](文档/客体整数执行.汉语.md)。内存执行、导入连接、默认 Shell 动态加载、跨模块互调与 WasmGC 仍待完成。

用户态解释器现可执行内存读写、增长、复制、填充、数据初始化与丢弃,完整回归共 342 项。详[客体内存执行](文档/客体内存执行.汉语.md)。越界检查覆盖回绕、空操作和无部分写入;导入、默认 Shell 动态加载、链接与 WasmGC 仍待完成。

客体解释器已支持固定平台函数导入、按导出名查找、启动一次及默认空函数引用表;独立 C Wasm 原始字节实际运行并完成四次回调核验,完整回归共 348 项。详[客体导入与启动](文档/客体导入与启动.汉语.md)。默认 Shell 文件加载、通用跨模块链接、WASI、间接调用和 WasmGC 仍待完成。

默认用户态 Shell 现支持从磁盘运行 Wasm 子任务、等待、运行中终止和退出码报告;重启后可再次加载,包括独立 C 模块。父 Shell 在子程序运行时仍可读写文件。完整回归共 352 项,四个默认镜像已更新,详[命令壳程序运行](文档/命令壳程序运行.汉语.md)。通用任务与内存池、模块链接、WASI、间接调用、磁盘空间回收和 WasmGC 仍待完成。

2026-09-25:独立宽除函数使 ARM64 命令壳代码超出一 MiB 代码预算,凡以文件命令壳为基础的用例都将失败。ARM64 常量装载现在只在高十六位非零时才发 `MOVK`,文件命令壳缩小约七万字节,余量转正;新的[代码量诊断。豫](代码量诊断。豫)可随时核对两架构余量。两架构不带外部模块共 360 项通过;带外部模块的 368 项运行时观察到父子任务同写串口的间歇交错失败,详[臂常量装载](文档/臂常量装载.汉语.md)。

控制台输出现由内核按行缓冲:每个任务在内核私有页蓄一行,遇换行、缓冲写满、读输入、任务退出或被终止时才一次写串口,一行输出不再被另一个任务的字节截断。两任务各写 3000 行的 `控制台行原子` 场景及 `--只验 名称` 选项已加入验证器,两架构共 362 项通过,带外部模块的 370 项连续通过,详[控制台按行原子输出](文档/控制台行缓冲.汉语.md)。

2026-09-25:降级后端改为寄存器式:虚拟操作数栈映射到寄存器,常量与比较同后继指令融合,函数入口一次性检查调用栈。ARM64 命令壳代码从 978 KB 缩到 162,900 字节,AMD64 从 798,873 缩到 184,000 字节,为继续扩展执行器留出预算;两架构共 362 项(带外部模块 370 项)QEMU 验收全部通过。详[寄存器降级](文档/寄存器降级.汉语.md)。

2026-09-25:内核新增内存块管理:ARM64/AMD64 各有 32 块×2 MiB 的物理池,服务二二 `内存块(n)` 为任务按需增加块,服务二三返回块数;`memory.grow` 超过八页时把线性内存迁入动态块并继续增长,任务退出、故障、被终止时归还,复制任务复制全部块,池尽时干净地失败。新增四个场景,两架构共 378 项(带外部模块)QEMU 验收全部通过。详[内存块管理](文档/内存块管理.汉语.md)。

2026-09-28:寄存器降级抽出目标描述(`库/裸机后端/降级目标。豫`:操作系统 × 指令集)。入口、导入桩、内存增长助手和代码起址随目标而变,函数本身的降级只取决于指令集;裸机目标生成的镜像与改动前逐字节相同。新增 Linux 目标(路二):与裸机同一套固定地址布局,入口把栈移到用户区栈顶、按需 `mmap` 动态区、最后 `exit_group`;导入模块名为 `Linux`,按入口表(`read`、`write`、`exit_group`)生成系统调用桩,地址类参数加线性内存基址。命令行工具 `yy原生生成 臂六十四|兼容六十四 输入.wasm 输出`(本包的 `原生生成` 入口)直接写出静态 ELF64;样例 [原生你好](原生样例/你好/说明.汉语.md) 在 Linux arm64 与 x86-64 上输出“你好”、回显标准输入并以退出码 7 结束。

2026-09-28:新增 macOS 目标(路二)。arm64 macOS 只执行位置无关的程序,因此降级增加“地址模式”:裸机与 Linux 用绝对地址;macOS 把名义地址一律写成“全局基址寄存器 x25 + 偏移”,入口用 `adr` 取得代码起址再加固定的锚距求出 x25(数据段固定在映像起址后 64 MiB,代码长短不影响距离)。苹果与 Windows 的 ARM64 都保留 x18,所以 ARM64 的线性内存字节数寄存器统一改为 x15(ARM64 裸机镜像因此改变;AMD64 镜像逐字节不变;普通豫言验证的打印、底层搬运、回收压力三项在两架构 QEMU 上通过)。macOS 导入经 dyld 绑定的导入槽调用 libSystem,导入桩保存 x15 与 x30,返回 -1 时经 `___error` 转成 -errno。`yy原生生成 苹果 臂六十四 输入.wasm 输出` 写出带特设签名的 Mach-O;样例 `原生你好` 的 `苹果入口` 在本机输出“你好”、回显标准输入并以退出码 7 结束。

2026-09-28:执行器 `客体二号` 在 Linux 上原生运行(路二,解释执行)。降级新增目标内建导入 `导入:目标:平台号`(绑定为常量:裸机 1、Linux 2、macOS 3),其他目标的导入降级为陷阱桩(Linux 上用 `brk #0`、`ud2`);Linux 入口表增至 40 个系统调用(文件、时钟、随机、管道、套接字、进程等),x86-64 的系统调用桩支持第五、六个参数(从传参暂存取入 r8、r9,r9 先保存),参数类别新增“有符号整数”(如 `lseek` 的偏移)。执行器按平台号选择实现:`林启动` 从 `/proc/self` 写入程序名、参数与环境,`林底层` 是底层接口 45 个函数的 Linux 后端,`林文件原语` 让 GC 程序的文件原语经底层接口访问宿主文件系统。`yy原生生成 Linux 架构 执行器.wasm 输出 客体.wasm` 把客体嵌进执行器生成独立可执行文件;`yy原生一致性 [--经 docker]`(本包的 `原生一致性` 入口)在两种架构的 Linux 上运行 7 个普通探针与 2 个文件探针,与裸机验证所用的期望输出逐字比较:18 项全部一致。详见[客体二号](客体二号/说明.汉语.md)。

2026-09-28:同一份执行器也在 macOS arm64 上原生运行:macOS 入口表扩充为 30 个 libSystem 函数,导入桩支持有符号参数与可变参数(按 Apple ARM64 约定放在栈上,如 `openat` 的权限、`fcntl` 的第三参、`ioctl` 的地址),导入槽只为“苹果”模块的导入绑定符号;执行器新增 `苹系统`、`苹启动`(`sysctl` 取参数与环境)、`苹底层`(45 个函数的 macOS 后端)与 `原生系统`、`原生底层` 两个分派模块。`yy原生一致性 --系统 苹果` 在本机运行 9 个探针,全部与裸机期望输出逐字一致。

2026-09-29:`yy原生一致性` 支持 `--只验 名`,在构建前仅选择名称包含该文字的探针;没有匹配项时报错退出。文件二依赖文件一写下的文件,可用 `--只验 盘-文件` 同时选择两项;macOS ARM64 上这两项通过。

说明.文言.md

# 豫言双架构裸机之始

## 今之全系(先阅此)

豫言操作系统今为可启、可交互、有持久文件系统之单核系统,ARM64 与 AMD64 皆于 QEMU 通过自动验收:

| 层 | 所载 | 文 |
|---|---|---|
| 内核 | 手编机器码(豫言源所生):页权限之隔离、定时之抢占、二任务槽之创建、等待、终止、回收、复制,单条整数消息之邮箱与阻塞接收,动态内存块(线性内存可增),设备窗口与 IOMMU 之隔离,Virtio 设备之用户态访问,控台之入环与 Ctrl-C 之标,实时钟([墙钟之务](文档/墙钟服务.文言.md):ARM64 读 PL031、AMD64 读 CMOS) | 本目录诸专题 |
| 用户态执行器 | `客体二号`:以底层模式之常豫言所书 WasmGC 解释器(栈机、保守标记清扫、异常、尾调用、软浮点),于用户态行普通豫言程序 | [客体二号](文档/客体二号.文言.md) |
| 文件系统 | 用户态 Virtio 块驱动加双区追加日志之持久文件系统(多层目录、崩溃安全之提交扇区、紧缩),离线造盘之器 `yy造盘` | [客体二号](文档/客体二号.文言.md)、[文件系统提交日志](文档/文件系统提交日志.文言.md) |
| 壳 | 普通豫言所书之默认命令壳(`壳/壳。豫`):目录、切换、列、读、写、追加、复制、移动、建、删、运行、脚本、加、回显、设、取消、环境;命令之出可以 `>`、`>>` 导入文件,`运行` 可以 `< 文件` 改其标准输入、`甲 \| 乙 \| 丙` 连为顺序之管;子进程中亦可读写文件(由壳代办);Ctrl-C 可打断所行之程序(退出码一百三十)、弃所敲之一行([控台之入](文档/控台输入.文言.md))| [客体二号](文档/客体二号.文言.md) 验收一节 |
| 进程 | 同步子进程:复制任务,子任务以盘上之程序易己,父任务候其退出码;标准输入之改向、环境之变量随复制授于子任务 | 同上“子进程”“标准输入重定向、环境变量与顺序管道”二节 |
| 动态装载 | 多实例:运行中自盘装载 Wasm 模块,跨模块导入导出与双向回调(含延迟之链) | 同上“多实例”一节 |
| 数值 | 小数运算走 IEEE 754 软浮点(加减乘除、诸转、定点六位转文、%.17g 之精确表示、文转小数);Wasm 之 f32、f64 诸指令(较、算、取整、开方、转、饱和截断)亦以软浮点行之,逐位与 V8 相校 | 同上“软浮点”“Wasm 浮点指令”二节 |

**构与行**(于仓库根目录、已装 QEMU):

```sh
node 豫言操作系统/宿主/节点/宿主.cjs yy豫构.wasm 文件 豫言操作系统/裸机/豫言系统。豫 --编译器 ./yy4_bs.wasm --输出 yy豫言系统.wasm
YY_GC_INITIAL_HEAP_SIZE_MB=1024 node 豫言操作系统/宿主/节点/宿主.cjs yy豫言系统.wasm 运行 --架构 兼容六十四      # 交互;缺省带示例程序;壳中书“退出”以终,Ctrl-C 断所行之程序,卡死则按 Ctrl-A 继按 X 强止
YY_GC_INITIAL_HEAP_SIZE_MB=1024 node 豫言操作系统/宿主/节点/宿主.cjs yy豫言系统.wasm 构建 --预置 某目录树       # 唯造镜像与盘,并印 QEMU 之令
```

`--预置` 缺省即 `豫言操作系统/裸机/示例`(书 `--预置 无` 则为空盘),其所指之目录树全入于盘(盘缺省六万五千五百三十六扇区即三十二兆字节,`--盘容量` 可改);树中以 `。豫` 终者先编为程序(`/程序/你好。豫` 成 `/程序/你好.wasm`),以 `.底层库` 终之标记文件构同名之底层包(`/库/库甲.底层库` 成 `/库/库甲.wasm`),壳中以 `运行 /程序/你好.wasm 参…` 启之,普通豫言程序可用 `豫言_加载模块`、`豫言_调用导出` 装载而调库。用法见 `豫言操作系统/裸机/豫言系统。豫`;可行之示例程序(你好、回声、质数、斐波那契、统计、复制文件、行数、环境变量)见 [示例](文档/示例.文言.md)。

**验**:

```sh
node 豫言操作系统/宿主/节点/宿主.cjs yy豫构.wasm 文件 豫言操作系统/裸机/普通豫言验证。豫 --编译器 ./yy4_bs.wasm --输出 yy普通豫言验证.wasm
YY_GC_INITIAL_HEAP_SIZE_MB=1024 node 豫言操作系统/宿主/节点/宿主.cjs yy普通豫言验证.wasm                       # 四十二项乘双架构,约十二分;--只验 普通-壳- 可只行一类
```

涵:普通豫言程序(打印、列表、闭包、异常、回收之压、小数、浮点指令、表指令)、壳(基本、文件命令、运行子进程、子进程之文件、输出重定向、脚本、示例程序、环境变量与管、子程序崩溃之隔、盘上之大程序)、语言测试集 `应用/豫言编译器/测试/网页汇编` 之十二例、磁盘(跨重启读写、离线造盘)、动态装载(含回收之压)、内核服务之探针。内核本身别有 `yy裸机验证`(下文,三百余项)。

普通豫言壳于拆词前去行模所入之末换行,令参数与 `退出` 复得正解。交互就绪与模拟器毕事之旧候限,各增百倍,以察较久之壳验;`--只验 壳-基本`、`--只验 壳-运行`、`--只验 壳-子进程文件` 于 QEMU 二架构皆过。验证器仍以输出与所期逐字校之。

于仓根备 QEMU,验裸机:

```sh
node 豫言操作系统/宿主/节点/宿主.cjs yy豫构.wasm 文件 豫言操作系统/裸机/验证。豫 --编译器 ./yy4_bs.wasm --输出 yy裸机验证.wasm -j 24
YY_GC_INITIAL_HEAP_SIZE_MB=1024 node --no-liftoff 豫言操作系统/宿主/节点/宿主.cjs yy裸机验证.wasm
```

二〇二六年九月二十八日,Node 26.3.0 上,`--no-liftoff` 令「客体整数执行」之大函数径经优化编译,避 Liftoff 单函代码区之限;上令双架构三百八十验皆过,运行约八十秒。

**WASI**:WASI preview1 之兼容层,今由 `客体二号/WASI名称。豫` 与 `WASI分派。豫` 部分接入;旧实现存于 [WASI库](WASI库/说明.文言.md) 以备参。二十二样各至少于一原生目标行过;裸机子任务之随机熵源与底层文件代办犹待为。

**今之界**:内核唯二任务槽,故一时唯一子进程、子进程不得再起子进程,管亦唯顺序(诸段相继而行,前段必自终);子进程之文件事由初始任务经邮箱代办(每信三字节,量大甚缓);实时钟唯秒之精与 UTC;跨实例唯传数值;无 SIMD。

标准网页汇编整数模块经豫言提前编译,成两机启动镜像。机器字节、标号、重定位、首部与页表皆以豫言作之,无英文汇编源,不借外汇编及链接之器。

臂机于一级异常层立页与向量,返零级以行客;兼容机自保护模式入长模式,立页、描述符、任务状态及中断门,转第三环以行客。核心验硬件所存用户态,授串口、核验、用户态、时钟与任务查询诸服务。旧验收须四次核验;常规程序可径退,不受此测试约束。

初版两机各六试:正常、隔离、错果、释页权、操作数栈溢、调用栈溢。前二须成,后四须拒;退码与串口文字并验,不以印字独为证。验证器亦豫言所作,限时候之,超时终本轮所生进程,产物及日志藏新建临时目录。命令详汉语稿。

用户两栈分区而有界,函数诸参及局部合计至多一百二十八,代码至多一兆字节。今单核、静态大页,两客分域轮行之实现详[双任务调度](文档/双任务调度.文言.md),实测另载。今二槽可动态生灭、等待、终止、回收与传消息;[用户命令壳](文档/用户命令壳.文言.md)初具,未授输入模块者默认载之。通用多任务、文件、持久化、完整命令壳、客中动态加载及完整垃圾回收犹未备。用户代码与栈未细分写行之权,不以此冒生产沙箱。旧普通豫言仍循原 WasmGC 后端。

串口由客体访设备,模拟退出惟为止试。生成器不先算客体之果;其自身尚由旧编译器构建,以 Wasm 行之亦借既有宿主。客体无旧库依赖,非整个自举工具链已独立。此为微内核引导原型,非完备操作系统。

用户态结构控制已通,两架构二十试皆过,详[结构控制](文档/结构控制.文言.md)。后续时钟与轮行之进展,见[双任务调度](文档/双任务调度.文言.md)。

增非阻塞读字节,双架构二十四试皆过,详[控制台输入](文档/控制台输入.文言.md)。

今增客故障独退与退出码之问,两机一三八试俱成,详[故障隔离](文档/故障隔离.文言.md),并载避旧编译缓存误验之法。

今增阻塞待客与退出唤醒,两架构一四八试俱成,详[阻塞等待](文档/阻塞等待.文言.md)。

今增有权止客之术,两架构一五四试俱成,详[主动终止](文档/主动终止.文言.md),动态创建及回收未毕。

今增行中复制任务,两机一六〇试俱成,详[运行时创建](文档/运行时创建.文言.md)。今单槽静态池,动态加载及资源复用未成。

今固定池之生、待、止、收与再用皆通,两机一七二试成,详[任务回收](文档/任务回收.文言.md)。通用多客分配、通信、动态加载、命令壳及持久文件犹待。

今增受所属与世次句柄约束之双向信函,两机一八〇试成,详[任务通信](文档/任务通信.文言.md)。接收暂不阻塞,客态服务所需犹续进。

今待信、唤醒与彼止之处置皆通,两机一九二试成,详[阻塞通信](文档/阻塞通信.文言.md)。通用调度、长字节与客态服务犹续进。

今造镜像默认常规运行,省方式或言“运行”皆可;旧正常、隔离仍守验收之义。详[常规运行](文档/常规运行.文言.md),两机二一〇试成。非谓完整高级豫言及 WasmGC 已能行。
今设备地址隔离已及用户线性区,首末、上界、只读与用户可见性皆验,两机共二六二试成。详[用户设备内存](文档/用户设备内存.文言.md)。默认用户命令壳可交互治任务;虚拟磁盘驱动、文件持久化、动态执行器与 WasmGC 尚未成。
今接用户设备寄存器与“设备驱动”造镜方式,两机二六八试成,详[用户设备寄存器](文档/用户设备寄存器.文言.md)。核主初置与授页,用户可协商特性、定队列;磁盘传输、退出清理及文件持久化尚待续作。
今用户态虚拟磁盘可读写、刷新,另启模拟器而数据仍在;两机二八〇试成,详[用户磁盘读写](文档/用户磁盘读写.文言.md)。文件目录、命令壳文件术及设备服务分进程,犹待续作。
用户文件系统提交日志已验复启、缺尾、坏记与满盘,两机二九四试成,详[文件系统提交日志](文档/文件系统提交日志.文言.md)。目录、文件名、删除、空间回收与命令壳文件术犹未成。
今用户文件目录可建、寻、枚举、替换、分段读与删,复启仍守柄之世次,两机三〇八试成。详[用户文件目录](文档/用户文件目录.文言.md)。命令壳文件术、独立文件服务与日志盘占回收犹待作。
默认用户壳今兼文件、目录、路径及显式格式化,旧任务与输入术皆存,两机三一四试成。详[命令壳文件操作](文档/命令壳文件操作.文言.md)。日志盘占回收、独立文件服务、动态加载与 WasmGC 犹待完成。
设备主自然毕、显式退出、陷阱及硬件缺页,今皆由核夺权、复位而清设备映射;子毕不夺父权。两机三二六试成,详[设备退出清理](文档/设备退出清理.文言.md)。随机在途压力、通用资源池、盘占回收、动态加载与 WasmGC 犹待完成。

客体取字及三十二位变长数之读,已验两架构,诸试共三百二十八项皆成;复以独立网页汇编执行器验其模块并行其试。详[客体取字](文档/客体字节读取.文言.md)。此仅载入之基,未入默认命令壳;模块全验、动态执行与垃圾收集尚待续成。

客体模块之头、段序、段界、名字与选段之限,皆验于两架构,诸试共三百三十项而成。详[客体模块分段](文档/客体模块区段.文言.md)。录目仅知段址;段内全验、指令与实例化待续,未可载行外来程序。

客体整数函数之目,今验类型、导入、定义、局部、导出与启动签名,诸试共三百三十二项而成。详[客体函数之目](文档/客体函数索引.文言.md)。代码全验与其余资源之读待续,录目成不授执行。

客体内存、全局、数据段之读与独立工作区初置,皆验两架构,诸试共三百三十四项而成。详[客体资源初置](文档/客体资源初置.文言.md)。先遍验主动段,乃复制其字;尚不行函数,全验、实例化与动态执行待续。

客体整数函数体今可解而录指令,验形与立即数,回填条件出口,诸试共三百三十六项而成。详[客体解指令](文档/客体指令解码.文言.md)。操作数栈之验与执行待续,解成不授行。

客体整数函数之操作数与控制栈皆验两架构,诸试共三百三十八项而成。详[客体栈之验](文档/客体操作数栈.文言.md)。四十四例与标准验证同;执行、运行陷阱、模块全验与动态运行待续。

用户态整数解释器今实行标准模块之控制、算术与调用,求和、阶乘皆客体自算,诸试共三百四十项而成。详[客体整数之行](文档/客体整数执行.文言.md)。内存令、导入、命令壳载行、跨模块互调与垃圾收集待续。

用户态解释器今可行内存读写、增长、复制、填充、段初置与弃,诸试共三百四十二项而成。详[客体内存令](文档/客体内存执行.文言.md)。回绕、空界与失败不半写皆验;导入、命令壳载行、链接与垃圾收集待续。

客体解释器今连定平台之术,按名寻导出,启动一度,并受默认空表;独立 C 模块之原字实跑,四次回调皆成,诸试共三百四十八项。详[客体导入与启动](文档/客体导入与启动.文言.md)。命令壳载行、通用互连、WASI、间接调用与垃圾收集待续。

默认用户态壳今可自盘载行模块为子,候其归、终其行、示其码;复启仍可载,独立 C 模块亦成。子行时父仍可读写。诸试三百五十二项,四默认镜像已新,详[命令壳载行](文档/命令壳程序运行.文言.md)。通用任务内存池、互连、WASI、间接调用、磁盘空间回收与垃圾收集待续。

二〇二六年九月二十五日:独立宽除之函使臂之命令壳码逾一兆之限,凡以文件命令壳为基之试皆将败。臂之常量装今唯高十六位非零方发 `MOVK`,文件命令壳减约七万字节,余地复正;新设[代码量诊断。豫](代码量诊断。豫)可随时核两架构之余。两架构无外部模块共三百六十项皆成;带外部模块之三百六十八项,行时见父子二任务同写串口而字节交错之间歇败,详[臂常量装载](文档/臂常量装载.文言.md)。

控制台之出,今由内核以行蓄之:每任务于内核私页蓄一行,遇换行、缓满、读入、任务退出或被终止,乃一并书于串口,一行不复为他任务之字所断。二任务各书三千行之 `控制台行原子` 景及 `--只验 名` 之选皆已入验证器,两架构共三百六十二试皆成,带外部模块之三百七十试连成,详[控制台以行为单](文档/控制台行缓冲.文言.md)。

二〇二六年九月二十五日:降之后端改以寄存器为栈:虚拟栈项居于寄存器,常量与比较并于后令,入函一并核调用栈。ARM64 命令壳自九百七十八千字节减至十六万二千九百字节,AMD64 自七十九万八千八百七十三减至十八万四千,预算得宽,可续增执行器之能;两机共三百六十二项(并外部模块三百七十项)QEMU 之验悉过。详[寄存器降级](文档/寄存器降级.文言.md)。

二〇二六年九月二十五日:内核增内存块之管:ARM64、AMD64 各有三十二块、每块二兆字节之物理池,服务二二 `内存块(n)` 为任务按需增块,服务二三返块数;`memory.grow` 逾八页,则迁线性内存于动态块而续增,任务毕、败、被终止皆归还,复制任务尽复其块,池尽则干净而败。增四景,两机共三百七十八项(并外部模块)QEMU 之验悉过。详[内存块管理](文档/内存块管理.文言.md)。

二〇二六年九月二十八日:寄存器之降析出目标之述(`库/裸机后端/降级目标。豫`:操作系统 × 指令之集)。入口、导入之桩、内存增长之助与代码之始址随目标而变,函数之降唯依指令之集;裸机目标所生之镜像与改前逐字节同。新增 Linux 目标(路二):与裸机同一定址之布,入口移栈于用户域之顶、须则 `mmap` 动态之区、终以 `exit_group`;导入之模块名 `Linux`,依入口之表(`read`、`write`、`exit_group`)生系统调用之桩,址类之参加线性内存之基。命令之器 `yy原生生成 臂六十四|兼容六十四 输入.wasm 输出`(此包 `原生生成` 之入口)径书静态 ELF64;样例[原生你好](原生样例/你好/说明.文言.md)于 Linux 之 arm64 与 x86-64 书“你好”、回显标准入而以退出码七终。

二〇二六年九月二十八日:新增 macOS 目标(路二)。arm64 之 macOS 唯行位置无关之程序,故降级增“址式”:裸机与 Linux 用绝对之址;macOS 以名义之址皆书为“全局基址寄存器 x25 加偏移”,入口以 `adr` 取代码之始,加定之锚距而得 x25(数据段恒居映像之始后六十四兆字节,代码之长不改其距)。苹果与视窗之 ARM64 皆保留 x18,故 ARM64 线性内存字节数之寄存器统改为 x15(ARM64 裸机之镜像因之而变;AMD64 之镜像逐字节不变;普通豫言验证之打印、底层搬运、回收压力三项,二构于 QEMU 皆通)。macOS 之导入经 dyld 所绑之槽呼 libSystem,导入之桩存 x15 与 x30,返负一则经 `___error` 化为负 errno。`yy原生生成 苹果 臂六十四 输入.wasm 输出` 书带特设签名之 Mach-O;样例 `原生你好` 之 `苹果入口` 于本机书“你好”、回显标准入而以退出码七终。

二〇二六年九月二十八日:执行器 `客体二号` 原生行于 Linux(路二,解释而行)。降级增目标之内建导入 `导入:目标:平台号`(绑为常量:裸机一、Linux 二、macOS 三),他目标之导入降为陷阱之桩(Linux 用 `brk #0`、`ud2`);Linux 入口之表增至四十系统调用(文件、时钟、随机、管道、套接字、进程等),x86-64 系统调用之桩受第五、六参(自传参暂存取入 r8、r9,先存 r9),参之类增“有符号整数”(如 `lseek` 之偏移)。执行器依平台号择其实:`林启动` 自 `/proc/self` 书程序名、参数与环境,`林底层` 乃底层接口四十五函数之 Linux 后端,`林文件原语` 使 GC 程序之文件原语经底层接口访宿主之文件系统。`yy原生生成 Linux 架构 执行器.wasm 输出 客体.wasm` 嵌客体于执行器成独立之可执行文件;`yy原生一致性 [--经 docker]`(此包 `原生一致性` 之入口)于二架构之 Linux 行七普通探针与二文件探针,与裸机之验所用参照之出逐字相校:十八项皆一致。详见[客体二号](客体二号/说明.文言.md)。

二〇二六年九月二十八日:同一执行器亦原生行于 macOS arm64:macOS 入口之表扩为 libSystem 函数三十,导入之桩受有符号之参与可变之参(依 Apple ARM64 之约置于栈,如 `openat` 之权限、`fcntl` 之第三参、`ioctl` 之址),导入之槽唯为“苹果”模块之导入绑符号;执行器新增 `苹系统`、`苹启动`(以 `sysctl` 取参数与环境)、`苹底层`(四十五函数之 macOS 后端)与 `原生系统`、`原生底层` 二分派之模块。`yy原生一致性 --系统 苹果` 于本机行九探针,皆与裸机参照之出逐字一致。

二〇二六年九月二十九日:`yy原生一致性` 支持 `--只验 名`,造程序前唯择名含所授文之探针;无合者报错而止。文件二赖文件一所书之卷,可用 `--只验 盘-文件` 并择二项;macOS ARM64 上二项皆过。