内存管理-14-内核文档翻译-1-reserved-memory.txt

本文翻译自:
msm-5.4/arch/arm64/boot/dts/vendor/bindings/reserved-memory/reserved-memory.txt


*** Reserved内存区域 ***

保留内存被指定为 /reserved-memory 节点下的一个节点。操作系统应将保留内存排除在正常使用之外,可以创建子节点来描述特定的保留(从正常使用中排除)内存区域。此类内存区域通常设计用于各种设备驱动程序的特殊用途。

每个内存区域的参数都可以使用以下节点编码到设备树中:

1. /reserved-memory 节点

#address-cells、#size-cells(必需) - 标准定义,应使用与根节点相同的值
ranges(必需) - 标准定义,- 应为空

2. /reserved-memory/ 子节点

reserved-memory 节点的每个子节点指定一个或多个保留内存区域。每个子节点可以使用“reg”属性来指定特定范围的保留内存,#####或使用带有可选约束的“size”属性来请求动态分配的内存块。

按照通用名称推荐的做法,节点名称应反映节点的用途(如“framebuffer”或“dma-pool”)。如果节点是静态分配,######则应将单元地址 (@<address>) 附加到名称中。

3. 属性:

需要下面的 a) 或 b)。

a) 静态分配

reg(必需)- 标准定义

b) 动态分配

size(必需)- 基于父级 #size-cells 的长度,保留的内存大小(以字节为单位)。

alignment(可选)- 基于父级 #size-cells 的长度,分配对齐的地址边界。

alloc-ranges(可选)- prop-encoded-array(地址、长度对)。指定可接受分配的内存区域。

如果同时存在 reg 和 size,则 reg 属性优先,size 将被忽略

4. 附加属性:

compatible(可选) - 标准定义

- 可能包含以下字符串:
    shared-dma-pool: 这表示内存区域旨在用作一组设备的 DMA 缓冲区共享池。如果需要,操作系统可以使用它来实例化必要的池管理子系统。
    供应商特定字符串,格式为 <vendor>,[<device>-]<usage>

no-map(可选)- 空属性
- 表示操作系统不得创建该区域的虚拟映射,不得将其作为系统内存标准映射的一部分,也不得在任何情况下允许对其进行推测性访问,除非在使用该区域的设备驱动程序的控制下。

reusable(可选) - 空属性
- 操作系统可以使用此区域中的内存,但限制是拥有该区域的设备驱动程序要能够将其回收。通常,这意味着操作系统可以使用该区域来存储易失性或缓存的数据,这些数据可以以其他方式重新生成或迁移到其他地方。

Linux 实现注意事项:

- 如果存在“linux,cma-default”属性,则 Linux 将使用该区域作为连续内存分配器的默认池。

- 如果存在“linux,dma-default”属性,则 Linux 将使用该区域作为一致 DMA 分配器的默认池。


5. 设备节点对reserved内存的引用

/reserved-memory 节点中的区域可以通过向设备节点添加 memory-region 属性而被其他设备节点引用。

memory-region(可选)= phandle,phandle 是 /reserved-memory 子节点的。

示例
-------
此示例为 Linux 内核定义了 3 个连续区域:
一个是所有设备驱动程序的默认区域(名为 linux,cma@72000000,大小为 64MiB),一个专用于帧缓冲区设备(名为 framebuffer@78000000,8MiB),一个用于多媒体处理(名为 musical-memory@77000000,64MiB)。

/ {
    #address-cells = <1>;
    #size-cells = <1>;

    memory {
        reg = <0x40000000 0x40000000>; //1GB
    };

    reserved-memory {
        #address-cells = <1>;
        #size-cells = <1>;
        ranges;

        /* global autoconfigured region for contiguous allocations */
        linux,cma {
            compatible = "shared-dma-pool";
            reusable;
            size = <0x4000000>;
            alignment = <0x2000>;
            linux,cma-default;
        };

        display_reserved: framebuffer@78000000 {
            reg = <0x78000000 0x800000>;
        };

        multimedia_reserved: multimedia@77000000 {
            compatible = "acme,multimedia-memory";
            reg = <0x77000000 0x4000000>;
        };
    };

    /* ... */

    fb0: video@12300000 {
        memory-region = <&display_reserved>;
        /* ... */
    };

    scaler: scaler@12500000 {
        memory-region = <&multimedia_reserved>;
        /* ... */
    };

    codec: codec@12600000 {
        memory-region = <&multimedia_reserved>;
        /* ... */
    };
};

 

 

内核中文文档:https://dri.freedesktop.org/docs/drm/translations/zh_CN/vm/index.html

 

posted on 2024-07-04 18:22  Hello-World3  阅读(119)  评论(0编辑  收藏  举报

导航