设计原则:每物理页恰记一次。页状态是骨架(天然去重);fp 是进程配额账本(含压缩原始体积);两者交叠用卫生行显式去重,绝不隐藏。
| 行 | MiB | 数据源(怎么算) | 为什么这么算 |
|---|---|---|---|
| 生态应用 Σfp(APP) | 773.6 | 每个 App 进程 task_vm_info.phys_footprint 求和 | fp 是配额视图:internal + compressed(stored 原始体积) + iokit_mapped + NV + page_table |
| 系统服务 Σfp(SYS) | 1,936.3 | 系统进程同口径 | 同上 |
| 内核及驱动 | 1,798.5 | wire 751.7(vm_stat)+ 内核可分页 12.9(N−Σint−Σvlt 减法)+ 内核压缩stored 1,033.9(comp_stored−Σ任务压缩) | 锁页/可分页按页状态;内核侧压缩数据必须补基数(见 §4) |
| 预留 | 578.7 | R_chip 408.05(ioreg dram-size − hw.memsize)+ R_pool 170.7(secluded 150 + 残差 20.7) | 固件预切与 ANE 隔离区对 OS 不可见 |
| 可用(立即) | 631.6 | vm_stat free(⊇ speculative 274.0) | spec 在 free 里已计 |
| 文件缓存 | 1,883.4 | E − S(external − speculative) | 文件页物理单计;永远不用 Σ任务 external / resident(缺页记账 2.1×) |
| 压缩节省行 | −1,423.0 | −(comp_stored − comp_occ),整机一条 | fp 基数装的是 stored 数据体积(≈2.0×),物理只占槽位 → 差额就是压缩器替整机省下的 DDR |
| fp卫生 ① −iokit残差 | −29.5 | Σfp − Σint − Σ任务stored − ΣNV − Σtagfp(账本恒等式移项) | IOSurface/GPU 缓冲记在进程 fp 又占 wire(双计)→ 从 fp 侧扣、归内核桶唯一归属 |
| fp卫生 ② +volatile驻留 | +19.0 | Σ任务 purgeable volatile 驻留 | volatile 驻留 fp 不含(对系统"白送"),但物理在 N 桶 → 补回 |
| fp卫生 ③ −NV账本 | −13.9 | Σ ledger_purgeable_nonvolatile | NV 与 internal/compressed 账本级重复(实测加上恰好多 13.9) |
| fp卫生 ④ −tagfp | −10.7 | Σ tagged 账本(media/graphics/network/neural footprint) | tagged footprint 与内核侧交叠 → 扣 |
| 合计 | 6,144.0 | = 6 GiB ✓(五场景 S0–S4 全部偏差 0.0) | |
所有桶必须落到页状态上才闭合——这就是"每页恰一状态"的可验证形式。
① iokit 残差 = fp 与 wire 的重复记账(最大的一条)。内核账本机制 [SRC xnu-7195 task.c:986-1009 / vm_map.c:20208-20229]:IOKit 映射进任务时内核同时打点两列——ledger_credit(iokit_mapped, bytes); ledger_credit(phys_footprint, bytes);(注释原话 "bump both counters")。这些 DMA 缓冲物理上是锁页 → 同一批页,fp 按映射配额收一次,wire 按物理状态收一次。14.8 的 task_vm_info 不暴露 iokit_mapped/alternate/page_table 列(新版 xnu 才暴露)→ 残差 = fp − 已暴露分项 = 未暴露列的精确打包和。
相机场景的直接证据(S5↔S6 / S9 A/B):mediaserverd 的 IOSURFACE 映射 510.2↔14.0 MiB(442→2 个区域,VM map 按 user_tag 直读),与 fp 残差 474.5↔4.5 同步摆动(吻合 92%);wire 1,781.4↔795.5。
| Δwire(相机开↔关) | MiB | 在 fp 里吗 | 记账处理 |
|---|---|---|---|
| mediaserverd 映射的 IOSurface 像素缓冲 | 496.3 | 是(fp iokit_mapped 按配额收) | 重复 → 去重一次 |
| 驱动/内核私有(ISP DMA 环、驱动缓冲) | 489.6 | 否(任何 fp 都不含) | 只在 wire,天然无重复 |
| 合计 Δwire | 985.9 | S9 实测 1,781.4 ↔ 795.5 | |
"全独立页"假设三重反驳:① 状态穷尽(映射页只能住 wire 或 N)② N 无空间(内核可分页相机开时 133.8→81.4 不升反降)③ 幅度对账(全独立需 wire 涨 ~1,482,实测 985.9)。误判为"全额外"则合计 +496.3 爆表。
②③④ 是账本级小重复:volatile 驻留是 fp 故意不含的"白送"页(物理在 N,需补回);NV 账本与 internal/compressed 重复(实测 13.9);tagged 账本与内核侧交叠(10.7)。
| 行 | MiB | 构成 |
|---|---|---|
| 生态应用 / 系统服务 | 773.6 / 1,936.3 | Σfp 不变 |
| 内核及驱动(净) | 1,769.0 | wire + 可分页 + 内核压缩stored − iokit残差(IOSurface 锁页改归任务 fp 桶) |
| 预留 | 578.7 | R_chip + R_pool |
| 可用内存(广义) | 2,534.0 | free 631.6(立即 10.3%)+ 文件缓存 1,883.4(可回收 30.7%)+ volatile 19.0(可丢弃 0.3%) = 全机 41.2% |
| 压缩节省行 | −1,423.0 | −(comp_stored − comp_occ) |
| fp 校准项 | −24.6 | −NV 13.9 − tagfp 10.7(合并) |
| 合计 | 6,144.0 | 与明细视图恒等 ✓ |
| 行 (MiB) | S0 空闲 | S1 压后台 | S2 相机开 | S3 相机关 | S4 深压 |
|---|---|---|---|---|---|
| 生态应用 Σfp | 764.2 | 1,728.0 | 1,739.7 | 1,921.7 | 1,929.9 |
| 系统服务 Σfp | 1,935.0 | 2,024.2 | 2,718.3 | 2,360.3 | 2,874.4 |
| ·wire | 745.8 | 794.4 | 1,778.2 | 819.6 | 1,785.0 |
| ·内核可分页 | 4.2 | 133.8 | 81.4 | 245.0 | 62.8 |
| 内核压缩stored | 1,034.5 | 1,059.5 | 1,252.4 | 1,087.8 | 1,308.4 |
| 预留 | 586.5 | 566.3 | 560.1 | 564.2 | 555.3 |
| free / 文件缓存 | 626.0 / 1,886.8 | 214.5 / 1,255.7 | 99.0 / 720.7 | 317.3 / 921.5 | 74.5 / 698.0 |
| 压缩节省行 | −1,407.6 | −1,492.4 | −2,033.9 | −1,817.8 | −2,442.4 |
| 卫生① iokit残差 | 22.0 | 64.8 | 669.4 | 122.1 | 608.5 |
| 卫生② volatile | 20.1 | 15.9 | 0.1 | 27.0 | 9.6 |
| 卫生③ NV | 17.5 | 64.6 | 82.7 | 111.1 | 87.4 |
| 卫生④ tagfp | 11.9 | 26.4 | 19.9 | 69.3 | 15.6 |
| 广义可用 | 2,533.0 | 1,486.1 | 819.8 | 1,265.7 | 782.0 |
| 合计 | 6,144.0 | 6,144.0 | 6,144.0 | 6,144.0 | 6,144.0 |
free 40,067→4,768 页、wire 47,731→114,242 页、压缩槽 90,070→144,920 页——五个极端状态合计恒 6,144.0 偏差 0.0。相机签名:mediaserverd fp 38.4→708.4→48.6 MiB 锁步 wire +984/−958;相机 App 自身 fp 全程仅 ~24 MiB(成本住在 mediaserverd fp + wire,不在 App)。
| # | 规则 | 原因 |
|---|---|---|
| 1 | 主干求和只用页状态 | 内核给每页恰一个状态,天然去重 |
| 2 | 压缩换算用节省行整机一条;stored 基数双侧齐全(任务侧在 fp 内、内核侧走内核行) | stored 是数据体积(≈2.0×),物理只占槽;基数不齐 = 减了从未加过的量(差 998.8 实测) |
| 3 | iokit/tag 全归内核桶(唯一归属);NV 不加在 internal 之上 | fp 残差与 wire 重叠;NV 已含在 int/compressed(13.9 实测) |
| 4 | 文件缓存物理单计 E−S;永不用 Σ任务 external / resident_size | spec 已在 free;external/resident 是缺页记账(2.1×) |
| iOS 维度 | 鸿蒙对应(HarmonyOS 7 / HongMeng 1.13) |
|---|---|
| 生态/系统Σfp | Σ(Pss_Anon + Pss_Shmem) 按进程分类 |
| 内核(wire+可分页+压缩stored) | SUnreclaim+SReclaimable+内核栈/动态/页表/vmalloc/DireAllocate+ZramUsed |
| 节省行 comp_stored−comp_occ | SwapUsed逻辑 − ZramUsed(换出到 flash 的部分不占 DDR) |
| 预留 R_chip+R_pool | CmaUsed + RsvTotalUsed + HhpFree |
| 文件缓存 E−S | Cached |
| 卫生① iokit×wire 重复 | ION×IOFast 双账本重复(相机态 ~1.76G + 池缓存转化×文件回填 ~1.46G,空闲态 0) |
鸿蒙 16 GB 机同样闭合(空闲 3 快照 ±24 MiB = 0.15%);相机场景同构签名:App 自身 +40 MiB、驱动池 +1,689 MiB。详见主报告 §十一。
proc_listallpids() 只回 73/299 子集 → 用 sysctl KERN_PROC_ALL;② task_for_pid(0) 恒拒;③ mach_vm_region_recurse 对平台二进制 kr=0x4 → 走 BSD 路径;④ 场景表解析防 tagcmp/tagfp 键名覆盖;⑤ 永不 Σ任务 external。