From d587d394fe2402cb9fb7c0ae2307ee96664f9235 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Tue, 29 Sep 2026 11:47:32 -0400 Subject: [PATCH] [Docs] (P11): zero-copy stays switchable (ruling ID-P11-14) - MOBILEGL_IPC_ADOPT_TIER 2 (default) keeps today shared-memory push, 0 takes the T0 import, and an unusable T0 falls back to T2 with a named line; the server gets its own allow switch --- docs/Disaggregated/notes/p11/INTEGRATOR-DECISIONS-P11.md | 1 + docs/Disaggregated/notes/p11/PLAN-P11.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/Disaggregated/notes/p11/INTEGRATOR-DECISIONS-P11.md b/docs/Disaggregated/notes/p11/INTEGRATOR-DECISIONS-P11.md index 6784a681..c82a8833 100644 --- a/docs/Disaggregated/notes/p11/INTEGRATOR-DECISIONS-P11.md +++ b/docs/Disaggregated/notes/p11/INTEGRATOR-DECISIONS-P11.md @@ -17,3 +17,4 @@ | ID-P11-11 | 2026-09-29 | B0 的结论(`B0-CROSS-APP.md`):跨安全上下文连 server 的 unix 端点被 SELinux `connectto` 拒(shell 与另一个 app 都是),连上之后现有代码走共享段、7 个 fd 跨类别可用,数据面与协议不用改;B1 = 跨上下文的连接中介(导出的 bound Service 经 Binder 交出已连接的套接字)+ `fd:` 端点 + 按身份配对 + 防冻结 + 外部 client 的亲和 / 自旋策略 + 调用方认证。原生程序(Termux 一类)的引导方式交用户裁定。`AcceptPair` 按到达顺序配对(F2)是现有 server 的缺陷(unix 端点与非 `--serve` 的一次性 TCP server;产品 TCP 路径本已按身份配对),独立于 B1 先修(ID-P11-12)。`p11/b0` 保留到 B 落地(证据引用 `72926a88`)。 | 用户点名的消费者是原生程序,而跨上下文只有 Binder 能带 fd;原生进程没有 `Context`。 | `B0-CROSS-APP.md`、`DEBTS.md` | | ID-P11-12 | 2026-09-29 | **PAIR**:socket client 的控制与辅助连接按 nonce 配对。client 在两条连接上各先发一条 `PairBind{nonce, aux}`(控制连接上 Hello 紧随其后);server 用 `PairAcceptor` 取代 `SocketTransport::AcceptPair`(已删):跨调用保留未配对的连接,不读 `PairBind` 之后的字节,同 nonce、角色相反才配对;什么都不发就关的连接(就绪探测)静默关闭,2 s 内没有 `PairBind` 或没等到另一半的具名拒绝后关闭,最多 16 条待配对。`protocol.fbs` 追加一张表与联合末位成员,控制协议修订 **3 → 4**(按 pin 脚本的程序);rev-3 client 连新 server 得 `Refuse{WireFingerprint}`,不会被配对。门:`PairAcceptorTest` 8 例 × unix / tcp(探测后接真 client、四条连接交错、孤立辅助连接过期后下一个 client 正常、Hello 在前的旧 client 具名拒绝)加一个真 server 的端到端用例;按到达顺序配对放回后 8 例全红、端到端 rc=6(与设备上一致)。B1 注意:代 client 建连接的 Service 必须自己写这两条 `PairBind`。 | 就绪探测与并发连接会让会话配错;B1 的 broker 更会同时代多个 client 建连接。 | `MG_Remote/Transport/*`、`Server/PairAcceptor.*`、`ServerMain.cpp`、`protocol.fbs`、`CONTRACT-P11.md` | | ID-P11-13 | 2026-09-29 | B1 的原生路线按用户裁定(app_process helper + IPC 令牌)可行(`HSPIKE.md`):helper 经隐藏 `IActivityManager` 发显式广播交出自己的 Binder,server app 的 broker 核令牌、连自己的端点两次、以 `ParcelFileDescriptor` 交回,client 走 `fd:,`;shell 与另一 app 的 uid 下都通,令牌错按名拒绝。B1 只做这一种 broker(广播 + helper Binder,Java client 同样可用),`bindService` 等有消费者再加。依赖 ROM:直接跑的 `app_process` 不受隐藏 API 黑名单约束,若某 ROM 强制则原生路线断。`p11/hspike` 保留到 B 落地。 | 用户点名的消费者是原生程序;探针证明了唯一未验证的一环。 | `HSPIKE.md` | +| ID-P11-14 | 2026-09-29 | **零拷贝必须可开关**(用户):开关即 `MOBILEGL_IPC_ADOPT_TIER`——`2`(默认)= 今天的共享内存 + client 推送(T2),`0` = T0 零拷贝导入。开了但本会话用不了(server 自测不通过、server 端禁用、Stream 数据面)→ 退回 T2 加一行具名日志,不 Fatal;A1 在共享段上对 0/1 的握手期 Fatal 随 B2 改成这个回退。server 端另设允许 / 禁止零拷贝的开关。默认值在 B2 真机门之后按数据再议。 | 零拷贝依赖 AHB 导入与 ROM 行为,必须能退回已验证的共享内存路径。 | `PLAN-P11.md` §2 B2;B2 实现 | diff --git a/docs/Disaggregated/notes/p11/PLAN-P11.md b/docs/Disaggregated/notes/p11/PLAN-P11.md index e34a9bb3..710edc98 100644 --- a/docs/Disaggregated/notes/p11/PLAN-P11.md +++ b/docs/Disaggregated/notes/p11/PLAN-P11.md @@ -32,7 +32,7 @@ - **B0(设备探针,先做)**:跨 app 的 client 用 **retrace client + server app** 实现(用户 2026-09-29;不走 Termux 的路子)。两种 client:(a) retrace client 作为可执行文件在 adb shell 里运行(`shell` 域,最好驱动,先用它打通全链);(b) trace APK 里的 retrace client,render server 跑在另一个包名的 APK 里(`untrusted_app` 域、不同 uid 与类别,代表 Termux 一类 client 的真实处境,复核 ① ②)。测 ① retrace client 能否连上 server app 的 abstract unix 套接字并用 `SCM_RIGHTS` 传 fd(MLS 类别下预计被拒,要实测);② 不通时由两个 app 自己的 Java 侧引导:server app 暴露一个 bound Service,返回 socketpair 一端的 `ParcelFileDescriptor`,client app 绑定后交给原生 client;③ 经这条通道传 AHardwareBuffer 并导入(接 A3)。 - **B1(跨 app 共享内存数据面)**:控制面走 B0 选出的通道、数据面 `SharedSegments`(memfd 经 fd 传)——P10 设备实测同一 rd12 在 tcp loopback 51 fps、spawn+shm 120 fps(`notes/p10/C-MEASUREMENTS.md` §2),这一步本身就是外部 client 最大的收益,与 T0 无关。 -- **B2(T0)**:在 B1 的通道上做 AHB 导入,形状如下。 +- **B2(T0)**:在 B1 的通道上做 AHB 导入,形状如下。**必须留开关(用户 2026-09-29)**:`MOBILEGL_IPC_ADOPT_TIER` 就是这个开关——`2`(默认)= 不走零拷贝,行为与今天相同(共享内存段 + client 推送,T2);`0` = 走零拷贝(T0)。开了但本会话用不了(server 自测不通过、server 端关了零拷贝、数据面是 Stream)时退回 T2 并记一行具名日志,不 Fatal(A1 现在共享段上 0/1 的握手期 Fatal 随 B2 改为此回退);server 端另有允许 / 禁止零拷贝的开关。默认值在 B2 的真机门之后按数据再议。 B2 的形状:控制 op `AdoptStore` 经 unix 套接字传 AHB(Stream 上 A1 拒绝);Espryt `glBufferStorageExternalEXT`、Magma `VK_ANDROID_external_memory_android_hardware_buffer` 导入;server 起角色时自测、发布 `kCapAdoptT0`;client 取 min(旋钮, caps, 数据面规则);释放由 server 本地 fence 门控;CPU 读前 server 排空常驻写并等 GPU。主机只能验协议与回退(Linux 没有 AHB),GPU 正确性靠设备门。控制协议修订 3 → 4。预期:T0 省的是 RSS 与 Create 类持久映射推送,不减少 26.3 的 stage 字节。