用户态豫言客体执行器二号,以底层模式之常豫言书之(旧括号式 .低阶 源码由此代之)。其所行者,普通豫言所编之 WasmGC 模块:栈机之解释、分配与标记清扫之回收、异常、结构与数组、宿主之原语(输出、文件、命令行、同步子进程)、持久之文件系统与 Virtio 块设备之驱动。
构建
node 豫言操作系统/宿主/节点/宿主.cjs yy豫构.wasm 构建 客体二号 --输出 /tmp/yy客体二号.wasm
所成者标准 Wasm 模块(导出 启动),由验证之器 豫言操作系统/裸机/普通豫言验证。豫 读入,附客体模块与标志之数据段,生裸机之镜像。内存布局之常量(布局)其址与验证之器相约,不可妄改。
模块
布局 记内存布局与状态格之常量;基础 记输出、变长整数、内存与宽整数之助手;余者依依赖之序。语言之约见 应用/豫言编译器/文档/底层模式.文言.md。
域名报文 以普通豫言底层模式编解 DNS 一问及 A、AAAA 之答,可跳答名之压缩指针;原生进程于 Linux 以 UDP 用之。定报文之探针验二型与坏指针。
豫言操作系统底层接口:裸机之后端
裸机底层状态码、裸机底层基础、裸机底层句柄、裸机底层文件、裸机底层终端、裸机底层网络、裸机底层进程 七模块,乃[豫言操作系统底层接口](../../../豫言操作系统底层接口/总纲.文言.md)于裸机之实现(四十五函数,案见[底层接口方案](../../../文档/豫言操作系统底层接口方案.文言.md))。此皆新增、独立之模块:径用既有之文件系统(fs读文件、fs写文件、fs建目录、fs删除等)、控制台(读字节、读行、打印串)与时钟(时钟滴答、墙钟秒)原语,不改此诸既有之实现;入口唯于启动之时新增一次 底柄_初始化 之呼(固定格三六六四、三六六八存动态柄表之址与终端之模,表首存行入余态;经 取区域 分配柄表、路径缓、内容缓,暂存缓冲仍供文件与时钟之暂用)。
子任务重启清动态区,重启准备 并清旧柄表之址;次启复分配柄表而立根柄三。今子任务无块设备,底层文件诸事尚须初始任务以独立邮箱协议代行;GC 文件原语已有其对象协议。
- 柄之模:柄零一二为标准三流;柄三恒为根目录(唯一之预开目录);四起十三槽,按需授与既开之文件与目录,每槽各有专属之路径缓(二万二千四百字节)与内容缓(四十万九千六百字节,整文件缓存)。底文之暂径与数据缓亦取自动态区。
- 路径之解:相对目录柄而解,不含当前目录,
..越出目录柄之子树则报错,与既有主机文件中倚“当前目录”之状态而规整路径者,各自独立。 - 已知之限(皆于各文件双语之注逐条载明):
底层网络、底层进程一概返“不支持”(网络因裸机无网络栈;进程因桥接既有 GC 对象参数之子进程机制,不在本轮之内);建管道、取终端尺寸返“不支持”;填随机字节返“不支持”(裸机之熵源未定);文件与目录内容缓存之限四十万九千六百字节,逾则相应操作返“溢出”;单调之钟精度十毫秒(内核滴答),墙钟精度一秒(RTC)。 - GC 垫层之改接:控制台输出之原语(一至四号)经本接口之
写;Linux 上文件之原语经本接口之 Linux 后端(见下节)。裸机上文件之原语犹径用执行器内之文件系统(待办:扩整文件缓存之限,乃改经本接口)。
多平台:一执行器行于 Linux 与 macOS
执行器乃一整数 Wasm 模块,寄存器之降依目标而生裸机之像、Linux 或 macOS 之可执行文件。运行之时,以目标之内建导入 导入:目标:平台号(降时绑为常量:裸机一、Linux 二、macOS 三)择平台之实;他目标之导入降为陷阱之桩,不行。
林系统、苹系统:Linux 系统调用之包(导入模块名 Linux)与 macOS libSystem 之包(导入模块名“苹果”,返负一则桩已化为负 errno),并是林、是苹与各自 errno 之转表(二系统之号异)。原生系统于二者之间分派书、读、退出、时钟与终端之验。平台:书字节、读字节、退出、时钟之滴答、墙钟、中断之询,于原生系统改走系统调用或 libSystem;任务与邮箱之服务于原生系统尚未为,按败返之(待办)。林启动、苹启动:启动时书程序名区、参数区与环境块。Linux 读/proc/self/exe、cmdline、environ;macOS 用sysctl之KERN_PROCARGS2(缓冲乃启动时新增之二页)。其后宿主之原语不复分平台。林底层、苹底层:底层接口四十五函数之 Linux 与 macOS 后端,原生底层依平台号于二者之间分派(函数名冠以“原底_”);裸机后端诸函数之首,于原生系统转之于此。柄即文件描述符,三号为根目录“/”。Linux 开用openat2加RESOLVE_BENEATH(越界返七十六),遇ENOSYS则逐段用O_PATH|O_NOFOLLOW解之;路径状态经受限之柄查之,建删、改名与读链接先安全开父目录,双构之探针皆过。macOS 开用O_RESOLVE_BENEATH,路径状态用AT_RESOLVE_BENEATH,余诸径之作先受限开父目录;本机 ARM64 之探针验树内、出界链接与文件之变,皆过。状态各取自statx与fstatat,目录各取自getdents64与__getdirentries64。待办:Linux 旧核逐段退路与二平台开父目录后之并发更名竞态,以及旧版 macOS 不识守界标之退路。终端之模:Linux 用 TCGETS/TCSETS,macOS 用 TIOCGETA/TIOCSETA(原始之模同 libuv)。原生进程:二系统共用之进程、候与网络,系统之差聚于“进_”诸小函数。运行程序:fork(Linux 以 clone(SIGCHLD)),子接标准之流与工作之目录而 execve,败则经 O_CLOEXEC 之管告父以 errno;进程之柄自 2^30 起,进程之表在暂存之区。候以 ppoll(macOS 以 poll),进程之订每轮察之(有行中之进程则每轮至多候十毫秒)。TCP 可用 IPv4、数字 IPv6、localhost 与/etc/hosts名表;Linux 与 macOS 皆依/etc/resolv.conf次第问诸服务器之 A、AAAA,原名不获则次第附 search 或 domain 后缀再问。Linux 主机串空者听双栈,macOS 仍以 IPv4 听之;macOS 之 resolv.conf 未必尽载系统诸 DNS 路由(待办:系统 DNS 路由之接入、嵌四版之六版地址及区域号)。启动时忽 SIGPIPE,子于 execve 之前复其默认。启动之序:底层句柄之表与原生后端之暂存皆以取区域取之,必在初始化堆之前(其后区域之顶即堆之起,与堆相叠)。原生子进程:原生系统上同步子进程之原语四十三至四十六(程序之名依 PATH 解之,经运行程序起之;四十五接 /dev/null,四十六以二管并读常出与误出)。易当前目录时亦易进程之真目录,子进程故行于同一目录。异步子进程六十七至六十九亦在此:子进程之表(至多千二十四)启动时以取区域取之,回收时全表为根;二捕获之管设为不塞,收与候时尽读其见有之数据而询退码,候时以底层之等待并候诸管与诸进程之柄,其行同 Node 宿主(豫构调度器之试于原生宿主所出与 Node 逐字同)。待办:设子进程之入、环境(七十、七十一)尚未接于原生之系统。原生网络原语:传输控制协议之宿主原语七十七至九十(义同 Node 宿主:不塞,返(状态,值)),原生之系统经底层网络之包行之;裸机返负五十八。- 字节串之原语:九十一号
豫言_字节串_截取(自起点取定长之字节为新串,越界则以一百三十四退)于诸平台由执行器径行之,原生所行之编译器书其产物时用之。十一号“运行于MacOS”于 macOS 返真。 原生文件原语:原生系统上文件之宿主原语,路径犹由规范参数规为绝对之径,乃经底层接口访宿主之文件系统;启动时当前目录取自/proc/self/cwd或getcwd。WASI名称与WASI分派:识 WASI preview1 函数名四十六,已行取参数与环境、时钟、随机、读写标准流与文件、预开根目录、依径开与改、柄及路径状态、寻址与定位读写、目录读取、等待与退出。时钟、流、文件与等待诸呼经底层接口;裸机今无熵源,随机之呼返不支持。未行之呼返 ENOSYS。函数表分配后清零,使本地函数与导入函数得明辨。今二十二样各至少于一原生目标行过;文件测试、文件边界、睡眠之 Linux 二架构标准出经cmp验逐字同,出入之双架构标准出与标准错亦各逐字同。全平台与参照实现之逐字一致,犹待验。- 生成与验:
yy原生生成 Linux|苹果 臂六十四|兼容六十四 执行器.wasm 输出 客体.wasm嵌客体于执行器成独立之可执行文件(macOS 今唯 arm64);yy原生一致性(豫言操作系统/裸机/原生一致性。豫)以普通探针与文件探针行于 Linux(二架构;非 Linux 之系统加--经 docker)或 macOS(--系统 苹果,本机行之),与裸机之验所用参照之出逐字相校。
WASI path_readlink 已验客体内存之界,而接底层文件接口;原生系统可读符号链接,裸机底层今返不支持。此呼尚未以外来程序验其始终。
预编:WasmGC 之函数径为机器码(路二乙档之初版)
yy原生生成 … 执行器.wasm 输出 客体.wasm --预编(或 yy原生一致性 --预编)转客体 WasmGC 模块之每函数为一整数 Wasm 之函数,并入执行器之模块而同降为机器码;执行器如常解模块、建类型之表、初全局与数据,唯不复解释函数之体。转译之器在 库/裸机后端/预编转译。豫,执行器之运行时之接在 预编接口。豫。
- 值皆居值栈:布同解释(每槽八字节,引用与三十二位整数居低字),故保守之回收如常见之;转译之函数其签为(帧)→ i32,参数与局部自帧起,操作数其上,调用者置参数于栈顶,被调者之帧即自彼始。
- 简令内联,繁令呼解释之处理:局部、常量、i32 之算与比较、若干 i64 之令、引用之空与等、控制之流,径书整数之令;结构、数组、类型之转、余 i64 与浮点、访存、表与杂项之令,呼执行器所导之“预编_”诸函数(即解释器之处理函数),携立即数于模块字节之址。
- 控制一一相应:块、环、条件应整数 Wasm 之同名之构,分支先移所携之值于目标之槽;尾调(return_call 及间接、引用之尾调)先移参数于帧首,乃“调用而即返”,寄存器之降化之为尾跳;间接之调经执行器所导之
预编派发(依函数号二分,叶尾跳于转译之函数)。 - 异常以标传:抛则记载荷而置
状态_预编异常,每调转译之函数后验之,在尝试表内则跳至其处理之码,否则返;至最外犹有异常,则以未捕之异常退(一三七)。 - 大模块:逾四百四十八千字节模块之窗者(如编译器),不嵌于窗,而为尾块书于可执行文件(Linux 附文件之末,macOS 置 __LINKEDIT 中签名之前),执行器启动时读回于动态区之首;Linux 之代码过大则别为一载入段(ARM64 居 0x10000000,x86-64 居 0x50000000)。
- 降器因之而扩:“调用而即返”为尾跳;代码每五百一十二千字节插一陷阱之岛,越界与除零之验跳至最近之岛;巨函(逾二万令)之条件跳改为“反条件跳过加 b”;汇编器唯于条件之分支计十九位之位移(旧时 b、bl 逾一兆字节亦误报逾界)。
今之状(二〇二六年九月二十八日):macOS arm64 上普通探针、文件探针与原生探针凡十二项,于预编之式与参照之出逐字一致;短程序较解释约快二倍(多为启动之费)。待办:内联更多热令(ref.cast、struct.get、array.get、i31)、非引用之值留于寄存器、Linux 上预编之验、编译器自身之预编与原生之自举。
续记(二〇二六年九月二十九日):Linux ARM64 预编一致之全组十五项皆过,普通、文件与原生诸探针,同裸机或 Node 之参逐字相符。Linux x86-64 解释之打印探针已过;本机 Docker 之 Rosetta 载较巨预编之物,报 failed to mmap segment: 22,犹须于真 Linux x86-64 运行器验之。编译器自身之原生自举犹待成。