mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-11-15 08:51:49 +08:00
只用公开入口 proc.NewHost() 与 Host.Arena() 的导出方法;断言只看
"写入的字节能否原样读出 / 操作成功与否 / 空间能否被再次使用",
不碰块头布局、空闲链结构、内部字段。
写入→读出→归还→同尺寸再写入
超限请求失败且不破坏分配器
非 owner 归还被拒、块仍可读
旧 generation 读取报错(不返回错位数据)
插件退出回收后空间可复用
回收不波及内核自有块
伪造 offset 被拒
重复归还被拒
碎片化导致大请求失败(钉住现状)
变异验证:
Free 不标记为空闲 → 第二次 Put「空间不足」红
去掉归属校验 → 非 owner 归还被接受
去掉 generation 校验 → 过期引用被接受
## 实测发现的真实碎片故障
4MB 段内用 1MB 大块与小块交替铺满、释放三个大块后:
used=64 total=4194308 blocks=8
请求 2096090 字节 → arena: 空间不足(请求 2096090 字节,容量 4194228)
空闲总量远超请求,但被小块隔开 ⇒ first-fit 拿不到连续块。
Exchange Arena 只有邻块合并,没有整体整理(唯一的 Compact 属于
StageContext 段,不是这块内存)。
## 未完成(见 todo.md §7.2)
块搬运会改变 SharedRef.Offset,而持 ref 的是插件侧/调用栈局部变量,
内核无法批量改写 ⇒ 整理会使命中窗口内所有 ref 失效。需先决定形态
(仅内核自有块 / 零活跃窗口 / 改分配策略),再实现。
go test ./internal/plugin/proc/test -count=1 -race PASS
go build ./... / go vet ./... PASS
gofmt -l 干净