兼容层总览
“兼容”是最容易被含糊过去的词。所以在讲任何实现之前,先把口径写死——否则后面所有的进度汇报都可以靠重新定义词义变得好看。
四个口径
| 代号 | 口径 |
|---|---|
| P1 | 兼容 = 集合包含。说“能跑”时,要能说出跑的是哪个子集。 |
| P2 | 接口契约,而非容器模拟。不模拟操作系统,只履行接口。 |
| P3 | 边界可声明、可测量。说不清边界的兼容不算兼容。 |
| P4 | 兼容 = 回归矩阵覆盖的依赖闭包。“能跑”的证据是它在矩阵里。 |
原则与不做的事
- clean-room —— 零专有代码。
- 表驱动 —— SHIM_TABLE 加 .def 文件,而不是散落的 if。
- 每个 API 有正例用例 —— 没有用例的 API 视为未实现。
- 不做内核驱动 —— .sys / .ko / .kext 不实现,提供 hypervisor 兜底。
- 不做完整 macOS GUI 等价 —— 兼容目标限定在加载器与垫片面。
现状基线(实测事实)
| 面 | 现状 |
|---|---|
| 加载器 | ELF / PE32+ / Mach-O / FUJR 四套齐备 |
| Linux ABI | 一等公民:原生执行零垫片;命名表已同步为实现面 45 条 |
| Windows 垫片 | SHIM_TABLE 97 条:kernel32 40 · msvcrt 45 · gdi32 10 · user32 2 |
| Darwin | 8 个 BSD syscall + mach-trap 垫片 |
| 回归 | 59 用例 / TCG 59-59 |
| 样本 | Linux demo 119 · Windows 样本 8 · Darwin 2 |
已识别的硬缺口
这份清单是兼容线规划的直接动机,也是对“Linux 二进制能在上面原生跑”这类说法最有效的边界声明。
- user32 仅 2 条;无 ntdll 表,无 ws2_32 表
- LoadLibraryA 返回假句柄;无真实动态 CRT
- 无跨架构翻译器
- compat_audit 目前只覆盖 Windows 面
- 无真实世界程序矩阵;无签名与完整性容器
- Linux 面:10 条命名表项无实现,已移入 C01 / C08 目标集