4.4.6. ION 系统调试指南

4.4.6.1. 概述

ION 系统 是 Linux 内核用于管理设备之间内存共享一个内存管理子系统。
X5 BSP 系统中 ION 内存主要下面四种情况使用:

  • BPU 子系统

  • HIFI 子系统( DSP)

  • 开发者通过 hbmem 接口分配 ION 内存

  • 多媒体系统:包含硬件加速单元VINISPVSEGDCVPUOSDGPUDisplay

ION 内存区域

  • ION 内存管理子系统使用独立内存区域:在设备树保留区域,专门作为 ION 系统 , 详细ION 区域调整方法

  • Linux 系统通用内存分配器无法从 ION 内存区域分配内存的,比如内核的 kmalloc 和 vmalloc 以及用户的 malloc 等。

  • ION 内存管理子系统每个区域不同名字: carveoutchunkcma_reservedion_cmasystemsystem_contig

    • X5 BSP 中主要使用 3 个 ION 区域:cma_reservedcarveoution_cma

    • cma_reserved 主要多媒体系统提供内存

    • carveout 主要为 BPU 子系统提供内存

    • ion_cma 作为备用区域,当上述两个区域没有空间时, ION 管理子系统自动ion_cma 区域申请内存

注意:关于 ION 区域名称解释:

  • ION 区域一种动态分配内存区域,软件常用 heap(堆)的数据结构管理动态分配内存区域,所以文档调试日志每个 ION 区域称作 heap 区域

  • ION 是 Google 在 Android 中实现开源内存管理系统, ION 区域名称解释详细The Android ION memory allocator

ION 内存特点

功能 描述
内存管理 ION 提供一套通用内存管理机制 , 支持用户内核态从 ION 区域申请释放内存。
连续物理内存分配 ION 内存管理系统分配内存物理地址连续的,可以提供硬件加速单元(例如 GPU、 ISP、视频解码器等)直接使用
设备内存共享 ION 允许不同设备(例如 GPU、 ISP、视频解码器等)之间共享内存,通过内核实现设备通信数据交换。
进程内存共享 支持多个进程之间共享一块 ION 内存区域,无需内存拷贝
拷贝 多个进程可以直接访问共享内存区域,无需显式内存拷贝,从而提高内存使用效率系统整体性能。

ION 区域分配规则

ION 管理子系统分配内存时,需要 指定具体的 ION 区域,因此出现:
ION 整体空闲内存,但是由于指定区域已经分配导致无法分配情况。
解决办法: ION 管理子系统支持指定区域无法分配内存时会自动其他区域分配内存,分配逻辑如下:

  • 指定 cma_reserved 区域并且这个区域没有内存时: 优先选择 carveout 区域 ,其次是 ion_cma 区域

  • 指定 carveout 区域并且这个区域没有内存时: 优先选择 cma_reserved 区域 ,其次是 ion_cma 区域

  • 指定 ion_cma 区域并且这个区域没有内存时:选择 cma_reserved 区域

注意: ion_cma 区域存在目的作为其他区域备选

指定具体 ION 区域方法

  • 多媒体系统和 BPU 的软件框架内部指定首选 ION 区域,如下所示:

模块 首选 ION 区域
多媒体系统 cma_reserved 区域
BPU 系统 carveout 区域

注意

  • OSD 模块比较特殊, OSD 模块属于多媒体系统硬件加速单元,但是默认从 carveout 区域分配空间

  • 开发者通过 hbmem 接口分配 ION 内存通过 Flag 参数可以指定首选 ION 区域

4.4.6.2. ION 使用方法

ION 区域大小调整方法

ION 区域设备树预留一段物理地址空间,这些物理地址空间属于 DDR,当设备的 DDR 容量同时, ION 区域预留大小应该不同,
所以 Kernel 的设备树针对不同容量的 DDR ,提供三种情况默认配置,分别为:

  1. 1G 大小的 DDR 的默认 ION 区域配置

  2. 2G 大小的 DDR 的默认 ION 区域配置

  3. 大于等于 4G 大小的 DDR 的默认 ION 区域配置

上述三种情况默认配置启动过程选择一种生效,具体流程如下:

  1. miniboot 启动过程识别当前 DDR 的容量,并保存寄存器

  2. uboot 启动过程中,根据 miniboot 保存寄存器值,知道当前的 DDR 容量,然后解析 Kernel 设备树文件得到 当前 DDR 容量对应的 ION 内存默认配置

以上是 ION 区域默认配置生效流程, X5 BSP 还支持在 uboot 命令行进行修改 ION 区域配置。

注意: uboot 命令行保存的 ION 区域配置优先级大于 Linux 设备树配置的 ION 区域

Linux 设备树中 调整 ION 区域方法

BSP 源码的 kernel 目录文件 arch/arm64/boot/dts/hobot/x5-memory.dtsi关于 ION 区域配置如下:

/ {
	[...]
	reserved-memory {
		[...]

		/* UBoot will enable corresponding node when ddr size is confirmed */
		ion_reserved_1g: ion_reserved_1g@A4100000 {
			compatible = "ion-pool";
			reg = <0x0 0xA4100000 0x0 0x07000000>; /* 112MiB */
			status = "disabled";
		};

		ion_carveout_1g: ion_carveout_1g@AB100000 {
			compatible = "ion-carveout";
			[...]
		};

		ion_cma_1g: ion_cma_1g@B2100000 {
			compatible = "ion-cma";
			[...]
		};

		ion_reserved_2g: ion_reserved_2g@A4100000 {
			compatible = "ion-pool";
			[...]
		};

		ion_carveout_2g: ion_carveout_2g@C4100000 {
			compatible = "ion-carveout";
			[...]
		};

		ion_cma_2g: ion_cma_2g@E4100000 {
			compatible = "ion-cma";
			[...]
		};

		ion_reserved_ge4g: ion_reserved_ge4g@A4100000 {
			compatible = "ion-pool";
			[...]
		};

		ion_carveout_ge4g: ion_carveout_ge4g@E4100000 {
			compatible = "ion-carveout";
			[...]
		};

		ion_cma_ge4g: ion_cma_ge4g@124100000 {
			compatible = "ion-cma";
			[...]
		};
	};
};

开发者可以根据自己的 DDR 大小,按照如下表格找到不同 ION 区域对应配置,进行修改

DDR 容量 ION 区域对应设备树节点
1G 1. cma_reserved 区域: ion_reserved_1g
2. carveout 区域: ion_carveout_1g
3. ion_cma 区域: ion_cma_1g
2G 1. cma_reserved 区域: ion_reserved_2g
2. carveout 区域: ion_carveout_2g
3. ion_cma 区域: ion_cma_2g
大于等于 4G 1. cma_reserved 区域: ion_reserved_ge4g
2. carveout 区域: ion_carveout_ge4g
3. ion_cma 区域: ion_cma_ge4g

uboot 中调整 ION 区域方法

参考:uboot 动态配置内核 ION 预留内存大小功能使用说明

ION 调试手段

X5 BSP 提供两个角度查看 ION 调试信息方法:

  • ION 区域角度(内存提供者):

    • 描述 每个 ION 区域信息

    • 比如总共多少,使用多少,以及一次具体分配内存信息

  • client 的角度(内存使用者):

    • client 表示使用者身份标识,比如 进程 ID 、 VPU、 JPU 、等

    • 展示 client 整体占用大小一次具体分配内存信息

查看各个 ION 区域统计信息

命令如下:

  • 单独查看每个 ION 区域统计信息

cat /sys/kernel/debug/ion/heaps/ion_cma
cat /sys/kernel/debug/ion/heaps/cma_reserved
cat /sys/kernel/debug/ion/heaps/carveout
  • 查看所有 ION 区域统计信息

cat /sys/kernel/debug/ion/heaps/all_heap_info

其中 ion_cma、 cma_reserved、 carveout 对应了 X5 BSP 中使用的 3 个 ION 区域(其他区域使用)。

/sys/kernel/debug/ion/heaps/cma_reserved 为例:

root@buildroot:~# cat /sys/kernel/debug/ion/heaps/cma_reserved
-------------------------------------------------------------------------
the heap id is 6
-------------------------------------------------------------------------
-------------------------------------------------------------------------
    cma_reserved  heap total size        536870912
-------------------------------------------------------------------------
       heap name           client              pid             size
-------------------------------------------------------------------------
    cma_reserved            udevd              294          1134592
    cma_reserved            udevd              307          3145728
-------------------------------------------------------------------------
allocations (info is from last known client):
           udevd              294              gpu             4096 1
           udevd              294              gpu             4096 1
           udevd              294              gpu             4096 1
           udevd              294              gpu             8192 1
           udevd              294              gpu          1114112 1
           udevd              307              vpu          3145728 1
-------------------------------------------------------------------------
  total orphaned                0
          total           4280320
-------------------------------------------------------------------------
  • 第一部分打印heap id 是 ION 子系统内部各个不同类型的 ION 区域 的编号,详细参考 BSP 源码文件 kernel/include/uapi/ion.henum ion_heap_type

  • 第二部分打印heap total size当前 ION 区域系统预留大小(注意:单位为 byte, 10 进制)。

  • 第三部分打印:

    • 一列含义可以参考标题。

    • 备注:client 列为 udevd 时,说明这部分内存分配用户进程为 udevd,一般自动加载驱动 ko 后,驱动初始化通过 ION 申请内存。

  • 第四部分打印展示每个进程一次具体分配分配大小:

    • 第一列打印进程应用

    • 第二列打印是 PID(注意,这里的 PID 在每次启动可能不同,上打印 仅供参考 )。

    • 第三列打印是 X5 ION 系统自定义模块标识符,模块标识来源是 client 发起分配传递的 Flag。

    • 第四打印分配大小(注意:单位为 byte, 10 进制)。

    • 第五打印分配存在内核引用次数。

  • 第五部分数据总结:

    • total orphaned 打印没有 client 使用,但是没有释放内存大小。

    • total 打印当前 heap 总共分配出去内存大小(单位为 byte, 10 进制)。

查看从 ION 申请内存的 client 的统计信息

X5 设备/sys/kernel/debug/ion/clients/ 目录可以查看当前系统申请了 ION 内存的 client(除了 BPU 子系统):
注意:以下 client 的个数根据运行程序不同模块使用情况变化,仅供参考

root@buildroot:~# ls /sys/kernel/debug/ion/clients/
1114-0  display-0  dsp0-0  galcore-0  jpu-0 vio_driver_ion-0  vpu-0  vsi_cam_drv_ion-0

上述列出的 client 的解释如下:

文件名 client 描述
1114-0 进程 ID 使用了 ION 的进程,包含进程所有模块的 ION 的信息
display-0 显示子系统 -
dsp0-0 DSP -
galcore-0 GPU 2DGPU 和 3DGPU 使用的 ION 内存
jpu-0 JPU
osd_driver_ion-0 OSD
vio_driver_ion-0 Camera 相关硬件加速单元(除了 OSD) Camera 相关硬件加速单元,包含了 VIN、 ISP、 GDC、 VSE
vpu-0 显示子系统 -
vsi_cam_drv_ion-0 Camera 子系统后台服务 Camera 子系统后台服务使用的 ION 内存

每个 client 的具体占用可以使用 cat /sys/kernel/debug/ion/clients/<client name>查看,以查看“ galcore-0”的 ION 占用为例:

root@buildroot:~# cat /sys/kernel/debug/ion/clients/galcore-0
       heap_name:    size_in_bytes :  handle refcount :    handle import :       buffer ptr :  buffer refcount :  buffer share id : buffer share count
    cma_reserved:             1000 :                1 :                1 :         4302dede :                2:                2 :                1

    cma_reserved:             1000 :                1 :                1 :         417b1a04 :                2:                3 :                1

    cma_reserved:             1000 :                1 :                1 :         f8c13b57 :                2:                4 :                1

    cma_reserved:             2000 :                1 :                1 :         f2a1d186 :                2:                5 :                1

    cma_reserved:           110000 :                1 :                1 :         3b5dd773 :                2:                6 :                1

-------------------------------------------------------------------------
          total            115000
-------------------------------------------------------------------------
  • size in bytes: 单次申请的 ION 内存大小:单位是 byte, 16 进制

  • buffer ptr: 单次申请的 ION 内存物理地址

  • total: 当前 client 占用的 ION 区域总体大小:单位是 byte, 16 进制

ION 区域名称对应

ION 区域名称、在设备树节点名称、 hbmem 接口中 flag 的对应关系:

ION 区域名称 设备树节点名称 hbmem 接口中 flag
cma_reserved ion_reserved_xg HB_MEM_USAGE_PRIV_HEAP_2_RESERVERD
HB_MEM_USAGE_PRIV_HEAP_2_RESERVED
carveout ion_carveout_xg HB_MEM_USAGE_PRIV_HEAP_RESERVERD
HB_MEM_USAGE_PRIV_HEAP_RESERVED
ion_cma ion_cma_xg HB_MEM_USAGE_PRIV_HEAP_DMA
  • 表头中 xg: 表示 Linux Kernel 设备树关于 ion 保留空间节点后缀,由于针对不同 DDR 容量,进行不同默认定义,所以使用 xg 来表示容量

    • 比如 ion_reserved_xg 表示设备树节点: ion_reserved_1g、 ion_reserved_2g、 ion_reserved_ge4g

4.4.6.3. 根据业务场景调整 ION 区域大小

X5 BSP 中 ION 区域默认配置按照通用场景设置的,客户可以根据自己场景调整 ION 区域配置,下面介绍 ION 区域调整方法:

  • 理论计算 ION 资源占用情况

  • 实际运行程序,通过 ION 调试手段验证步骤理论值是否正确

  • 根据理论值设置 ION 区域

理论计算 ION 资源占用情况

摄像头接入相关模块

摄像头接入相关模块包括 VIN、 ISP、 VSE、 GDC、 OSD,对 ION 资源占用分为两个部分:

  • 第一部分:HBN 框架

    • 摄像头接入相关模块通过 HBN 框架 接入客户程序

    • VIN、 ISP、 VSE、 GDC 都抽象一个 Node 节点,多个 Node 连接成一个 Vflow

    • Node 之间数据传递方式:上游 Node 的图像数据存储输出队列中,下游节点上游节点输出队列获取图像数据

    • Node 输出队列存储空间是从 ION 中申请

    • HBN 框架 提供参数可以配置每个 Node 节点输出队列缓存个数,详细hbn_buf_alloc_attr_t 结构的 buffers_num 成员

  • 第二部分:后台服务程序

    • 上电后, 摄像头接入相关模块后台服务程序自动启动

    • 后台服务程序从 ION 中申请内存

HBN 框架

下面展示摄像头接入相关模块通过 HBN 框架 接入时,对 ION 内存占用情况:

其中 GDC 比较特殊,除了 GDC 的 Node 节点输出队列占用 ION 以外, GDC 的 BIN 文件占用,计算方法如下:
GDC BIN 文件占用 ION 资源的大小 = 4K_ALIGN( BIN 文件大小 )

模块 占用大小 格式
VIN ( 4K_ALIGN(宽 * 高 * 2 ) + 4096 )* 缓存个数 RAW10/RAW12/RAW16
ISP ( 4K_ALIGN(宽 * 高 * 1.5 ) + 4096 )* 缓存个数 NV12
VSE ( 4K_ALIGN(宽 * 高 * 1.5 ) + 4096 )* 缓存个数 NV12
GDC ( 4K_ALIGN(宽 * 高 * 1.5 ) + 4096 )* 缓存个数 NV12
OSD ( 4K_ALIGN(宽 * 高 )* 2 VGA8
( 4K_ALIGN(宽 * 高 * 1.5 )* 2 NV12
( 4K_ALIGN(宽 * 高 * 3 )* 2 SW_VGA4
( 4K_ALIGN( 2 * 高 * sizeof(uint32_t))* 2 POLYGON
  • 缓存个数: Node 节点输出队列缓存个数 , 详细hbn_buf_alloc_attr_t 结构的 buffers_num 成员

  • 高:当前节点处理图像区域 (OSD) 的分辨率

  • 4K_ALIGN: 按照 4K 的对齐运算 ,ION 区域分配最小单位是 4K

后台服务程序
功能 占用大小 ( N: Vflow 数量)
固定大小 0xAF1000 (11,472,896)
ISP 基础功能 (0x38000) * N + 0x102000
VSE 基础功能 0x8000 * N + 0x2000
开启 3DNR 功能 TotalSize = 宽 * 高 * 2
(4K_ALIGN(TotalSize) + 4K_ALIGN(TotalSize / 4)) * N
  • 4K_ALIGN: 按照 4K 的对齐运算

  • N:标识 Vflow 的数量

VPU

H264 编码
功能   占用大小                     描述                       
sei 自定义信息 16384 * 5 -
customMap 262144 -
vui 16384 -
Motion Vector 运动矢量相关缓存 4K_ALIGN(( 64_ALIGN( 长 ) * 64_ALIGN(宽) / 32)* 2 ) + 4096 -
FBC Luma table buffer 4K_ALIGN(( 256_ALIGN( 长 ) * 64_ALIGN(宽) / 32)* 2 ) + 4096 -
FBC Chroma table buffer 4K_ALIGN(( 256_ALIGN( 长 /2) * 64_ALIGN(宽)/32)* 2) + 4096 -
Sub-sampled buffer for ME( 运动估计 ) 4K_ALIGN(( Allign32( 长 /4) * Allign4(宽/4))* 2) + 4096 -
MediaCodec 软件接口输出 buffer 4K_ALIGN(长 * 宽 * 位深 (NV12 的位深: 1.5)) * 输出缓存数量 举例: 1080P 的情况下 是 计算结果是 3112960 字节
MediaCodec 软件接口输入 buffer 4K_ALIGN(长 * 宽 * 位深 (NV12 的位深: 1.5)) * 输入缓存数量 外部内存模式需要
task buffer 计算逻辑复杂,给出表格查询 -
重建参考 计算逻辑复杂,给出表格查询 -
  • task buffer重建帧和参考帧计算逻辑比较复杂,计算结果依赖图像分辨率,可根据实际图像分辨率参考如下表格,
    如果表格没有包含指定分辨率,可以根据如下表格进行估算

分辨率 摄像头举例 task buffer 重建参考
3840*2160 imx415 61501440 12443648 * 2
1920*1080 sc230 16560128 3,112,960* 2
1088*1280 sc132 16494592 2088960 *2
1600*1200 sc202 16547840 2883584 *2
640*480 sc035 16396288 462848* 2
H265 编码
功能   占用大小                     描述                       
sei 自定义信息 16384 * 5 -
vui 16384 -
Motion Vector 运动矢量相关缓存 4K_ALIGN(( 64_ALIGN( 长 ) * 64_ALIGN(宽) / 32)* 2 ) + 4096 -
FBC Luma table buffer 4K_ALIGN(( 256_ALIGN( 长 ) * 64_ALIGN(宽) / 32)* 2 ) + 4096 -
FBC Chroma table buffer 4K_ALIGN(( 256_ALIGN( 长 /2) * 64_ALIGN(宽)/32)* 2) + 4096 -
Sub-sampled buffer for ME( 运动估计 ) 4K_ALIGN(( Allign32( 长 /4) * Allign4(宽/4))* 2) + 4096 -
MediaCodec 软件接口输出 buffer 4K_ALIGN(长 * 宽 * 位深 (NV12 的位深: 1.5)) * 输出缓存数量 举例: 1080P 的情况下 是 计算结果是 3112960 字节
MediaCodec 软件接口输入 buffer 4K_ALIGN(长 * 宽 * 位深 (NV12 的位深: 1.5)) * 输入缓存数量 外部内存模式需要
task buffer 计算逻辑复杂,给出表格查询 -
重建参考 计算逻辑复杂,给出表格查询 -
  • task buffer重建帧和参考帧计算逻辑比较复杂,计算结果依赖图像分辨率,可根据实际图像分辨率参考如下表格,
    如果表格没有包含指定分辨率,可以根据如下表格进行估算

分辨率 摄像头举例 task buffer 重建参考
3840*2160 imx415 60968960 12443648 * 2
1920*1080 sc230 16461824 3112960 * 2
1088*1280 sc132 16445440 2088960 *2
1600*1200 sc202 16457728 2883584 *2
640*480 sc035 16420864 462848 * 2

BPU

功能   占用大小                     描述                       
固定占用 32768 * 2 只要使用 BPU 模块产生占用,并且占用 1 份
模型文件 4K_ALIGN( 模型文件大小 ) + 4096 * 3 只会占用 1 份
模型输入 Buffer 大小 模型输入格式决定,比如 NV12 :
(4K_ALIGN( [ 模型输入宽 ] * [ 模型输入高 ] ) +
4K_ALIGN( [ 模型输入宽 ] * [ 模型输入高 ] / 2 ))
只要调用 hbSysAllocCachedMem 接口,就产生占用
模型输出 Buffer 大小 模型输出尺寸决定,比如 yolov5 :
4K_ALIGN(output[0].AlignedByteSize) +
4K_ALIGN(output[1].AlignedByteSize) +
4K_ALIGN(output[2].AlignedByteSize) +
只要调用 hbSysAllocCachedMem 接口,就产生占用
  • 模型输入 Buffer 大小:通过接口 hbSysAllocCachedMem 申请,存储送入模型图片

  • 模型输出 Buffer 大小:通过接口 hbSysAllocCachedMem 申请,存储模型输出结果

  • AlignedByteSize: BPU 软件框架结构hbDNNTensorProperties成员变量 alignedByteSize

注意: BPU 占用 ION 资源存在一些特殊情况,所以精确方式需要运行模型程序测量:

  • 情况 1 :在某些模型中,运行时 BPU 的软件框架额外从 ION 申请一个区域,例如 yolov5。

  • 情况 2 :有模型输出算子需要额外 ION 内存,比如 yolov5

验证理论值

正式程序或者测试程序运行后,可通过 ION 调试手段 查看各个模块的 ION 内存实际占用情况。

查看从 ION 申请内存的 client 的统计信息 章节知道,大部分模块对应一个 client 节点, client 节点可以查看这个节点占用 ION 的 TotalSize,
但是有些模块比较特使, 所以三种情况讨论:

  1. 摄像头接入模块(除 OSD 和后台服务)整体作为一个 client, 无法查看每个模块的 ION 占用,所以需要借助其他方式

  2. BPU 模块:没有对应的 client,需要通过其他方式

  3. 其他模块: VPU、 VPU、 GPU、 OSD 等对应的 client 节点

摄像头接入模块

由于摄像头接入模块(除了 OSD),整体作为一个 client: vio_driver_ion-0, 所以只能看到整体占用大小,
为了查看各个模块分别占用 ION 资源情况,需要如下步骤:

  1. 在 HBN 软件接口指定 不同的 Flag,从而 all_heap_info体现不同名字 。

  2. 查看 all_heap_info 节点信息按照各个模块名字进行过滤。

以 VIN 模块举例:(其他模块参考如下表格,替换命令cimdma) 如下每行第 4 列是 VIN 模块占用 ION 资源大小( 10 进制,单位字节)

root@buildroot:~# cat /sys/kernel/debug/ion/heaps/all_heap_info |grep cimdma
  sunrise_camera             1070           cimdma             4096 1
  sunrise_camera             1070           cimdma          4149248 0
  sunrise_camera             1070           cimdma             4096 1
  sunrise_camera             1070           cimdma          4149248 0
  sunrise_camera             1070           cimdma             4096 1
  sunrise_camera             1070           cimdma          4149248 0
模块 标识 描述 HBN 软件接口指定 Flag
VIN cimdma - HB_MEM_USAGE_HW_CIM
ISP isp_yuv - HB_MEM_USAGE_HW_ISP
VSE other(cma_reserved) - 未定义,使用默认
GDC gdc - HB_MEM_USAGE_HW_GDC_OUT
GDC BIN 文件 gdcfb - HB_MEM_USAGE_HW_GDC

BPU 模块

如下每行第 4 列是 BPU 模块占用 ION 资源大小,每行第 4 列数字总和就是 BPU 占用 ION 资源大小( 10 进制,单位字节)

root@buildroot:~# cat /sys/kernel/debug/ion/heaps/all_heap_info |grep bpu
  sunrise_camera             1070              bpu            32768 0
  sunrise_camera             1070              bpu          9486336 0
  sunrise_camera             1070              bpu          4259840 0
  sunrise_camera             1070              bpu          7864320 0
  sunrise_camera             1070              bpu             4096 0
  sunrise_camera             1070              bpu          4259840 0
  sunrise_camera             1070              bpu             4096 0
  sunrise_camera             1070              bpu             4096 0
  sunrise_camera             1070              bpu            32768 0
  sunrise_camera             1070              bpu           229376 0
  sunrise_camera             1070              bpu           229376 0
  sunrise_camera             1070              bpu           454656 0
  sunrise_camera             1070              bpu           229376 0
  sunrise_camera             1070              bpu           454656 0
  sunrise_camera             1070              bpu           454656 0
  sunrise_camera             1070              bpu           454656 0
  sunrise_camera             1070              bpu           229376 0
  sunrise_camera             1070              bpu           454656 0
  sunrise_camera             1070              bpu           229376 0
  sunrise_camera             1095              bpu           450560 0
  sunrise_camera             1095              bpu           450560 0
  sunrise_camera             1095              bpu          1802240 0
  sunrise_camera             1095              bpu          7200768 0
  sunrise_camera             1095              bpu           450560 0
  sunrise_camera             1095              bpu          1802240 0
  sunrise_camera             1095              bpu          7200768 0
  sunrise_camera             1095              bpu           450560 0
  sunrise_camera             1095              bpu          1802240 0
  sunrise_camera             1095              bpu          7200768 0
  sunrise_camera             1095              bpu          7200768 0
  sunrise_camera             1095              bpu          1802240 0
  sunrise_camera             1095              bpu           450560 0
  sunrise_camera             1095              bpu          7200768 0
  sunrise_camera             1095              bpu          1802240 0

其他模块

如下命令,以 Display 模块例子: 注意: client 节点数字是 16 进制的,所以 total  5f0000 表示 Display 占用 ION 资源大小是: 0x5f0000 字节

root@buildroot:~# cat /sys/kernel/debug/ion/clients/display-0 |grep "total"
          total            5f0000
模块  client 文件名字
VPU vpu-0
JPG/MJPEG jpu-0
GPU galcore-0
Display display-0
OSD osd_driver_ion-0
DSP dsp0-0
摄像头接入模块后台服务程序 vsi_cam_drv_ion-0

修改 ION 区域生效

  1. 快速调试方法 : 通过 uboot 命令行配置 ,参考 uboot 中调整 ION 区域方法

  2. 正式使用方法:修改设备树重新编译镜像,参考 Linux 中调整 ION 区域方法