豫言操作系统底层基础 0.1.0
状态:草案。文言本见文言版。通用规则见[调用约定](../调用约定.汉语.md)。
范围
全树共用的状态码表,以及最基本的系统查询:时钟、随机、命令行参数与环境变量、退出、中断标志、平台探测、处理器数。本包依赖 底层库,是本树的根,其余各包都(直接或间接)依赖它。
时钟(时钟。接口。豫)
| 函数 | 参数 | 作用 | | --- | --- | --- | | 读单调纳秒 | 出 | 单调时钟的纳秒数,8 字节 | | 读墙钟纳秒 | 出 | 自 1970-01-01 UTC 起的纳秒数,8 字节;没有实时钟返回 58 | | 取时钟精度 | 时钟号, 出 | 时钟号 0 为墙钟、1 为单调时钟;精度以纳秒计,8 字节;时钟号不认识返回 28 | | 取时区偏移 | 时低, 时高, 出 | 某时刻(自 1970 起的秒数,低高两参)本地时间相对 UTC 的秒数,有符号 4 字节;不支持返回 58,此时 shim 试读时区文件,再不行按 UTC |
随机(随机。接口。豫)
| 函数 | 参数 | 作用 | | --- | --- | --- | | 填随机字节 | 址, 长 | 用密码学安全的随机字节填满缓冲;平台没有熵源返回 58 |
环境(环境。接口。豫)
| 函数 | 参数 | 作用 |
| --- | --- | --- |
| 取参数块 | 缓冲址, 缓冲长, 出 | 命令行参数各以零结尾依次拼成块;出址写(总长,个数)共 8 字节;缓冲不足返回 61,并写入所需总长 |
| 取环境块 | 缓冲址, 缓冲长, 出 | 环境变量 名=值 各以零结尾依次拼成块;其余同取参数块 |
| 退出 | 码 | 以退出码结束本进程,不返回 |
| 查询中断 | 出 | 读并清除中断标志(Ctrl-C),结果 0 或 1 |
| 取平台 | 出 | 1 裸机、2 Linux、3 macOS、4 Windows |
| 取处理器数 | 出 | 在线处理器数量 |
状态码
编号取 WASI preview1 errno 的子集,全树共用;括号里是 WASI 的名字。
| 码 | 名 | 码 | 名 | 码 | 名 | | --- | --- | --- | --- | --- | --- | | 0 | 成功 | 2 | 无权限(acces) | 3 | 地址已用(addrinuse) | | 6 | 暂不可用(again) | 8 | 句柄无效(badf) | 10 | 忙(busy) | | 14 | 连接被拒(connrefused) | 15 | 连接重置(connreset) | 19 | 配额已尽(dquot) | | 20 | 已存在(exist) | 21 | 地址错误(fault) | 22 | 文件过大(fbig) | | 27 | 被中断(intr) | 28 | 参数无效(inval) | 29 | 输入输出错误(io) | | 31 | 是目录(isdir) | 32 | 链接过多(loop) | 33 | 打开过多(mfile) | | 37 | 名字过长(nametoolong) | 43 | 无此设备(nodev) | 44 | 不存在(noent) | | 48 | 内存不足(nomem) | 51 | 无空间(nospc) | 52 | 未实现(nosys) | | 53 | 未连接(notconn) | 54 | 非目录(notdir) | 55 | 目录非空(notempty) | | 58 | 不支持(notsup) | 61 | 溢出,即缓冲不足(overflow) | 63 | 无特权(perm) | | 64 | 管道破裂(pipe) | 68 | 越界(range) | 69 | 只读文件系统(rofs) | | 70 | 不可寻址(spipe) | 71 | 无此进程(srch) | 72 | 已失效(stale) | | 73 | 超时(timedout) | 75 | 跨设备(xdev) | 76 | 无此能力,即越出授权(notcapable) |
其中 0、8、20、21、22、28、29、31、33、37、44、51、52、54、55、70 已被现有 WASI 库用过,并与 node:wasi 逐字对照验证。
与 GC 接口 8 个系统错误变体的映射(建议):
| GC 系统错误 | 底层状态码 | | --- | --- | | 未获授权 | 2、63、69、76 | | 资源暂不可用 | 6、10、27 | | 资源已失效 | 8、15、53、64、72 | | 资源不存在 | 43、44、71 | | 资源已存在 | 3、20 | | 资源配额已尽 | 19、22、33、48、51 | | 输入无效 | 21、28、31、32、37、54、55、61、68、70、75 | | 宿主操作失败(带文字) | 其余(含 14、29、52、58、73) |
平台注记
- 裸机:单调时钟由内核滴答(约 100 Hz)得,精度 10 ms;墙钟来自 RTC,只有秒精度;随机数的熵源未定(候选 virtio-rng、CPU 随机指令),此前
填随机字节返回 58;中断标志即内核服务 27;退出即内核服务 18。 - 桌面:时钟、随机、参数、环境、退出都是一次系统调用(Linux、macOS)或一个系统库函数(Windows);中断标志由信号处理(Linux、macOS)或控制台事件处理(Windows)置位。