PPysolate SpineREAD THE CODE · UNDERSTAND THE SYSTEM
课程与章节
CODE READING / 24

不支持的平台怎样报错

cow_other.go

本章目录

本文件只有一个平台构造器,但它决定调用者能否把返回值当作 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 中的构造器错误路径完成。