少于 1 分钟阅读 次阅读

简介

CMA 全称是 Contiguous Memory Allocator(连续内存分配器)。在 Linux 系统里,它会在系统刚启动时,强行圈出一块连续的物理内存。平时这块内存可以像普通内存一样被系统拿去用,但是一旦某些硬件外设开口要,系统就必须立刻把里面的东西清空挪走,把这块连续的物理内存完完整整地交给硬件使用。

为什么 RK3588 离不开 CMA?

8K 硬件编解码的 VPU、6 TOPS 的 NPU、以及 RGA 图形加速引擎等这些模块在干重活(比如用 GStreamer 做 MPP 硬件解码、或者跑 AI 算法)的时候:它们处理的大块数据缓冲,在物理内存上必须是连续的

如果系统跑久了,内存全变成了碎片,虽然总空间还剩很多,但找不出连在一起的大块内存。这时候如果没有 CMA 提前圈好的自留地,VPU 或者 NPU 申请内存就会直接失败,你的视频解码或硬件算法就会当场崩溃报错。

怎么查看和修改 CMA?

如果你在做定制化的 Ubuntu Base 固件,调整 CMA 是必修课。

1. 查看当前状态

在板子上直接运行: cat /proc/meminfo | grep -i "cma" 你能看到 CmaTotal(总分配了多少)和 CmaFree(还剩多少可用)。

2. 怎么调整大小

diff --git a/kernel/arch/arm64/boot/dts/rockchip/NK-6A13_V0A.dtsi b/kernel/arch/arm64/boot/dts/rockchip/NK-6A13_V0A.dtsi
index f638cd6b8..c3fe66143 100755
--- a/kernel/arch/arm64/boot/dts/rockchip/NK-6A13_V0A.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/NK-6A13_V0A.dtsi
@@ -17,13 +17,13 @@
 		#size-cells = <2>;
 		ranges;
 
-		/* Reserve 128MB memory for hdmirx-controller@fdee0000 */
-		cma {
-			compatible = "shared-dma-pool";
-			reusable;
-			reg = <0x0 (256 * 0x100000) 0x0 (128 * 0x100000)>;
-			linux,cma-default;
-		};
+		/* Reserve 384MB memory for hdmirx-controller@fdee0000 */
+        cma {
+            compatible = "shared-dma-pool";
+            reusable;
+            reg = <0x0 (256 * 0x100000) 0x0 (384 * 0x100000)>;
+            linux,cma-default;
+        };
 	};
 
 	es8316_sound: es8316-sound {

留下评论