[Docs] (P11): B0-CROSS-APP - SELinux refuses a foreign context the connect to the server app unix endpoint, past a brokered connect the shared segments work unchanged, default placement makes shm slower than tcp; ruling ID-P11-11 on what B1 must build, and the HyperOS uid freeze as a debt

This commit is contained in:
2026-09-29 09:34:26 -04:00
parent 6481691d1e
commit 2fcde6eb9b
3 changed files with 45 additions and 0 deletions
+1
View File
@@ -12,6 +12,7 @@
| P11 转出:Espryt 对零散写入按并集框上传,把影子里的旧纹素盖到框内 GPU 写过的空隙上(8×8 探针 41 个错,pull 与全部 Espryt 臂;Magma 对);dev `568090f0` 的 `AdoptDriverLevelIntoShadow` 有同样的并集框近似(读代码) | dev(独立任务) |
| P11 转出:Magma 单进程重放 rd12 在加载帧耗尽 `vm.max_map_count`(65530,其中 57–60k 是 `/dev/kgsl-3d0` 映射)而 abort;split 的 Magma 与 Espryt 都正常 | dev(独立任务) |
| P11 转出:client 与 server 共用日志前缀时,client 以 `"w"` 打开 `<base>.server.log` 写转发来的 server 日志,会截断 server 自己的文件(依赖 server 日志行的 P12 装置测试可能受影响) | 小修 |
| P11 转出(B0 F1):HyperOS 熄屏时冻结 server app 的整个 uid(FGS 进程、supervisor、会话子进程同一 cgroup),在飞会话 120 s 后 `Fatal{BarrierTimeout}`;FCL 同机用法同样受影响(`notes/p11/B0-CROSS-APP.md`) | B1 的防冻结一项;FCL 侧另议 |
| P11 转出:pull 构建没有任何门跑集成测试(`TextureRemintPullScenario` 在 pull 上自 P9 起就是红的,P11 M 修) | CI / 门的覆盖,需裁定 |
| `GetCaps` 的两个 blobref | 一旦运输,必须有 server → client 的 carrier rule,不能套 `SEG_STAGE` |
| E1 对照的重定义(ID-122) | 无主(开放问题 24) |
@@ -0,0 +1,43 @@
# P11 B0:同机跨 app 的 client 能否走 unix + 共享内存(真机)
2026-09-29,Redmi `2f7cbe2e`(Adreno 830,Android 16 / HyperOS),代码 `82467823`。server = trace APK #1(`top.mobilegl.plugin.trace`,`untrusted_app:c83`);client = adb shell 里的 retrace 可执行文件(`shell`)与 trace APK #2(`top.mobilegl.plugin.b0.trace`,`untrusted_app:c84`)。只记录、不设门。原始数据 `~/w7/notes/p11/evidence/b0/`,报告 `~/w7/notes/p11/b0-report.md`。
## 结论
**SELinux 挡的是连接这一步。** 另一个安全上下文里的 client 连不上 server app 的 `@abstract` 端点:`unix_stream_socket connectto` 被拒,`shell → untrusted_app:c83` 与 `untrusted_app:c84 → c83` 都一样。一旦连上(用 root relay 代替 broker),现有代码就走 SharedSegments(7 个 fd 经 `SCM_RIGHTS`:4 个段、3 个门铃),c84 读写、mmap c83 的段都没有拒绝,ssim 1.0。**数据面与协议都不用改,缺的是跨上下文的连接中介。**
| client → endpoint | 连接 | 数据面 | ssim(openra / rd12) |
|---|---|---|---|
| shell → `@mglb0` | **拒**(`avc: denied { connectto } … scontext=u:r:shell:s0 tcontext=u:r:untrusted_app:s0:c83,…`) | — | — |
| APK #2 → APK #1 的 `@mglb0` | **拒**(类别不同) | — | — |
| APK #1 自己的 client → 自己的 server | OK | SharedSegments | 1.0 |
| shell / APK #2 → tcp loopback | OK | Stream | 1.0 / 0.99988 |
| root → `@mglb0`;shell、APK #2 → root relay → `@mglb0` | OK | SharedSegments,7 fd | 1.0 / 0.99988 |
## 线程落位决定 shm 是否更快(Espryt rd12 稳态 fps)
| 落位 | tcp | shm |
|---|---|---|
| 默认(5 次) | 45–52 | **26** |
| server apply 线程在 cpu6、client 在 cpu7(3 次) | 54.5 | **118.0** |
默认下 apply 线程亲和两个大核(`auto` = `0xc0`)且自旋,外部 client 的 GL 线程落到同一对核上。干净落位时 shm 与 P10 的 app 内 shm(120 fps)相同,openra Espryt 491 → 903。Magma rd12 在各臂都受 server 限制(默认 19 tcp / 23 shm)。
## B1 要做的(按代码)
| # | 件 | 依据 |
|---|---|---|
| 1 | server app 里导出、校验调用方的 bound Service,把 client 的两条已连接套接字经 Binder 交出(最简:Service 自己连两次自己的端点,同 app 允许) | `MobileGLServerService.onBind` 今天返回 null;唯一入口是 `Listen` + `AcceptPair` |
| 2 | client 端点接受已连接的 fd(如 `fd:<control>,<aux>`) | `ClientSession.cpp:846-855` 今天只收 `fork` / `tcp://` / `unix:` |
| 3 | client 侧能调用 `bindService` 的引导:有 Java 的 client(FCL、启动器)直接用;Termux 一类原生程序没有 `Context`,要伴生的 helper(如 `app_process`)——**待用户裁定** | 原生进程没有 `Context`;`AServiceManager` 只到系统服务 |
| 4 | 按身份配对控制与辅助连接,不按到达顺序 | F2(下) |
| 5 | 外部 client 使用期间 server 进程不被冻结 | F1(下) |
| 6 | 外部 client 会话的亲和 / 自旋策略 | 上表 |
| 7 | broker 上的调用方认证(unix 端点今天没有令牌) | `Handshake.h` `AuthenticatePeerToken` 无令牌即通过 |
## 顺带查出
- **F1 HyperOS 熄屏冻结整个 server uid**(`frozen uid = … reason=screen off`),FGS 进程、supervisor 与会话子进程同一 cgroup,在飞的会话 120 s 后 `Fatal{BarrierTimeout}`。FCL 的同机用法也会碰到。
- **F2 `AcceptPair` 按到达顺序配对**(`SocketTransport.cpp:373-420`,TCP 与 unix 共用):`ServerControlActivity` 的就绪探测是一次空的 `connect()`+`close()`,2 s 内会与下一个真 client 的控制连接配成一对,会话读到探测的套接字后退出;两个 client 同时连也会交错。
- 构建:`-Pmobilegl.apkSuffix` 只改文件名;包名由 `-Pmobilegl.applicationIdSuffix` 决定。
- 工具提交 `72926a88`(`p11/b0`):`tools/device_bench/disagg/fdrelay.c`,root 的字节 + `SCM_RIGHTS` 中继,B1 broker 的替身。
@@ -14,3 +14,4 @@
| ID-P11-8 | 2026-09-29 | 本阶段查出、不在 P11 修的:Espryt 零散写入按并集框上传覆盖 GPU 纹素(dev 独立任务);Magma 单进程 rd12 耗尽 `vm.max_map_count`(dev 独立任务);client 与 server 共用日志前缀时截断 server 日志(小修);pull 构建没有门跑集成测试(需裁定);split 的线程落位(性能)。 | 按规矩不顺手修 dev 的缺陷;性能只记录。 | `DEBTS.md` |
| ID-P11-9 | 2026-09-29 | **集成头 `82467823`**(dev 合并 + A-host + 计划文档)整套门:G1 对 P11 基线符号增 0 减 0、`.text` `0xa56413`;fatal census 79、refusal 词 4、link ratchet 171、spawn parity 0、协议修订 3、wire-declines 53/53;卫生 12/12;unit 2654;integration-split / spawn / tcp 392 / 309 / 321;integration-magma-split / spawn / tcp / full-split 214 / 193 / 177 / 613;integration-gpu monolith / inproc 2529 / 2529。verify 构建 unit / integration-verify / integration-verify-split 2654 / 1298 / 1232。主机 retrace 230 / 236(6 项仍是 iterationrp 的宿主 llvmpipe JIT 崩溃,monolith 同挂)。 | — | 全部 |
| ID-P11-10 | 2026-09-29 | 推送前发现 origin 已前进到 `86dc38a0`(另一个会话把 Magma `eglSwapInterval` 的移植直接推到了本线)。它与已合并的 dev `c60639db` 在 9 个文件上逐字相同,另加 split 专属的 `ForgetRequestedSwapInterval`(`MOBILEGL_BUILD_DISAGGREGATED` 下;传输模式下 `~BackendObject_DirectVulkan` 调用它,结束的 server 会话不把交换间隔带给下一个,与 DirectGLES 同规则)。以合并吸收(`9176dcff`,净增 16 行),不改写 origin。 | origin 不能强推;两份实现只差这一处,取并集。 | `DirectVulkan.{h,cpp}`、`BackendObject_DirectVulkan.cpp` |
| 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 的缺陷,TCP 也受影响,独立于 B1 先修。`p11/b0` 保留到 B 落地(证据引用 `72926a88`)。 | 用户点名的消费者是原生程序,而跨上下文只有 Binder 能带 fd;原生进程没有 `Context`。 | `B0-CROSS-APP.md`、`DEBTS.md` |