ion_heap_type 枚举定义了 Android ION 内存分配器支持的不同类型内存堆,每种类型对应不同的内存特性和使用场景。以下是各类型的详细区别:
1. ION_HEAP_TYPE_SYSTEM
- 物理连续性:❌ 非连续
- 分配方式:
vmalloc() - 特点:
- 分配虚拟地址连续但物理地址不连续的内存
- 标准内核内存分配机制
- 适用场景:
- 普通用户空间内存分配
- 不需要物理连续性的缓冲
- CPU访问频繁的场景
- 限制:
- 无法用于需要物理连续内存的硬件模块(如DMA)
2. ION_HEAP_TYPE_SYSTEM_CONTIG
- 物理连续性:✅ 连续
- 分配方式:
kzalloc()或alloc_pages() - 特点:
- 保证物理地址连续
- 通过伙伴系统分配
- 适用场景:
- 需要物理连续的小块内存(<4MB)
- DMA传输
- 摄像头预览帧缓冲
- 限制:
- 大内存分配可能失败(内存碎片问题)
3. ION_HEAP_TYPE_CARVEOUT
- 物理连续性:✅ 连续
- 分配方式:从预留物理区域分配
- 特点:
- 从启动时预留的物理内存区域分配
- 内存来自专用物理地址范围
- 适用场景:
- GPU显存
- 视频编解码器专用内存
- 显示控制器帧缓冲
- 限制:
- 内存大小固定(启动时预留)
- 无法动态调整
4. ION_HEAP_TYPE_CHUNK
- 物理连续性:⚠️ 部分连续
- 分配方式:聚合多个小连续块
- 特点:
- 将多个小连续块组合成逻辑大块
- 虚拟地址连续,物理地址分段连续
- 适用场景:
- 需要大缓冲但系统碎片化严重时
- 替代
SYSTEM_CONTIG的备选方案
- 限制:
- 硬件访问需要scatter-gather DMA支持
5. ION_HEAP_TYPE_DMA
- 物理连续性:✅ 连续
- 分配方式:
dma_alloc_coherent() - 特点:
- 保证cache一致性
- 物理地址符合DMA对齐要求
- 适用场景:
- 需要DMA操作的设备
- 网络设备缓冲区
- 存储控制器缓冲
- 限制:
- 分配大小受DMA区域限制
6. ION_HEAP_TYPE_CUSTOM
- 物理连续性:由实现决定
- 分配方式:厂商自定义
- 特点:
- SoC厂商专有实现
- 支持特殊内存特性(如安全内存)
- 典型实现:
// 高通Secure Display Heap示例 #define ION_HEAP_TYPE_SECURE_DISPLAY 12 - 适用场景:
- DRM保护内容(如HDCP)
- 安全支付缓冲
- 指纹识别数据
- 限制:
- 厂商专属API,兼容性差
关键对比表
| 堆类型 | 物理连续 | Cache一致性 | 典型大小 | 硬件支持要求 |
|---|---|---|---|---|
| SYSTEM | ❌ | ❌ | 任意 | 无 |
| SYSTEM_CONTIG | ✅ | ❌ | <4MB | 需要连续物理地址 |
| CARVEOUT | ✅ | ❌ | 固定 | 无 |
| CHUNK | ⚠️分段 | ❌ | 大缓冲 | scatter-gather |
| DMA | ✅ | ✅ | 中等 | 标准DMA |
| CUSTOM | 可变 | 可变 | 厂商定义 | 专有硬件 |
使用场景示例
-
摄像头管道:
-
视频播放:
// 解码缓冲 ion_alloc_fd(ion_fd, 1920*1080*2, ION_HEAP_TYPE_DMA, ION_FLAG_CACHED); // DRM保护 ion_alloc_fd(ion_fd, 1920*1080*2, ION_HEAP_TYPE_CUSTOM, ION_FLAG_PROTECTED); -
机器学习:
// NPU输入缓冲 ion_alloc_fd(ion_fd, 10*1024*1024, ION_HEAP_TYPE_CARVEOUT, ION_FLAG_UNCACHED);
选择原则
-
硬件要求优先:
- DMA设备 →
DMA或SYSTEM_CONTIG - 安全内容 →
CUSTOM - GPU →
CARVEOUT
- DMA设备 →
-
性能优化:
- 频繁CPU访问 →
SYSTEM(带cache) - 设备直接访问 →
UNCACHED标志
- 频繁CPU访问 →
-
大小需求:
-
4MB大缓冲 →
CHUNK或CARVEOUT - 小碎片化缓冲 →
SYSTEM
-
-
特殊特性:
- 零拷贝共享 → 配合
dmabuf - 安全隔离 →
CUSTOM+ 硬件保护
- 零拷贝共享 → 配合
这些堆类型共同构成了 Android 设备的内存分配基础设施,使得不同类型的硬件和软件组件可以高效地共享内存资源。

1871

被折叠的 条评论
为什么被折叠?



