本文件只有一个平台构造器,但它决定调用者能否把返回值当作 prepared COW 使用。当前 COW 实现依赖 Linux 的 memfd、file seals、mmap 和 Linux 侧验证入口;非 Linux 不提供一个语义相近的替代 allocator,也不把 full-copy 伪装成 COW。
1. 构建选择和构造器
cow_other.go · L1–L9 · 打开完整源码
//go:build !linux
package spine
import "errors"
func newCOWRuntime() (cowRuntime, error) {
return nil, errors.New("prepared COW requires Linux")
}
//go:build !linux 使这份文件只在非 Linux 构建中生效。Linux 构建会选择 cow_linux.go 的同名 newCOWRuntime,因此 prepared.go 不需要在调用点写平台分支。文件只导入 errors,没有伪造 cowMemory,也没有引入 Linux 系统调用。
非 Linux 的 newCOWRuntime 直接返回 nil 和 prepared COW requires Linux。错误发生在普通 New 已经成功之后,NewPreparedCOW 会关闭那个暂时建立的 Runner,再把错误交给调用者。最终状态是“没有 COW Runner”,而不是“得到一个底层机制未知的 Runner”。
2. 调用路径中的状态
NewPreparedCOW
→ New 建立普通 Runner
→ newCOWRuntime 返回平台不支持
→ prepared.go 关闭普通 Runner
→ 调用者收到错误
这条失败路径不否定 NewPrepared:调用者仍可以显式选择 full-copy。它只保证选择了 COW 的调用者不会在非 Linux 上误以为自己得到了 sealed image、私有页映射、固定 mapping base 和对应的释放语义。
错误集中在构造阶段,后续没有 allocator、capture、attach 或实例映射状态可供清理。平台文件不负责修改 Runner,也不负责提供 fallback;资源收尾由 prepared.md 中的构造器错误路径完成。