.dts中的以下代码段描述了保留的内存:
reserved-memory {
#address-cells = <0x2>;
#size-cells = <0x2>;
ranges;
cma_reserved: linux,cma {
compatible = "shared-dma-pool";
reusable;
size = <0x0 0x1000000>; // 16MB
alignment = <0x0 0x2000>; // 8KB
linux,cma-default;
};
ion_reserved: ion@200000000 {
compatible = "ion-region";
reg = <0x2 0x0 0x1 0x0>; // 4GB
};
};
我可以理解ion_reserved
部分,但不了解cma_reserved
部分,特别是关于这16MB内存的地址。
谢谢!
答案 0 :(得分:1)
CMA (连续内存分配):之所以使用此分配,是因为dma需要连续内存,而使用可用的分配器,我们最多只能分配8 MB。因此我们在启动时使用cma(保留内存)。
“上方”节点中使用的属性:
可重复使用的属性-这是一个可选的以及为空的属性。 当节点指定此属性表示时,操作系统可以在以下位置使用此内存: 该区域,但是它们是设备驱动程序在需要时的限制 他们可以收回这些有争议的记忆。
Size属性-此属性告诉您cma和as的总大小 在上述节点中为16 MB。
对齐属性-分配对齐的地址边界。它 还要使用父级指定的2号尺寸单元。这就是为什么 “ alignment = <0x0 0x2000>;”
linux,cma-default属性-这也是一个空属性。如果这 提到属性,那么Linux将使用此内存区域 连续内存分配的默认值。他们也是相似的 属性“ linux,dma-default”(如果提到了此属性) 将使用此池区域作为DMA分配器。如果是cma首先 属性被使用,而dma使用第二个属性。
有关更多信息,请访问:https://www.kernel.org/doc/Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt
答案 1 :(得分:0)
文档(如Jitender所示)加上内核的控制台日志表明,cma
块是从系统内存中分配的。
设备树中的memory
节点:
memory {
reg = <0x1 0x0 0x0 0xB0000000>; // 2.75GB, lease last 1.25GB to video codec
device_type = "memory";
};
cma
块的内核日志:
[ 0.000000] Reserved memory: created CMA memory pool at 0x00000001af000000, size 16 MiB
[ 0.000000] OF: reserved mem: initialized node linux,cma, compatible id shared-dma-pool
我想以下内容反映了确认到设备树那部分的物理内存映射:
+=========================+ 0x3:0000:0000
| |
| |
| |
| ION (4G) |
| |
| |
| |
+=========================+ 0x2:0000:0000
| |
| Video decode (1.25G) |
| |
+-------------------------+ 0x1:b000:0000
| CMA pool (16M) |
| --------------------- | 0x1:af00:0000
| crash kernel (64M) |
| --------------------- | 0x1:ab00:0000
| |
| |
| System (2.75G) |
| |
+=========================+ 0x1:0000:0000
谢谢!