共享的多堆内存池管理器使用多堆分配器来管理一组具有不同功能/属性(可缓存、不可缓存等)的保留内存区域。
    可以在运行时将所有不同的区域添加到共享的多堆池中,从而提供不透明的属性值(整数或枚举值),驱动程序或应用程序可以使用该值来请求具有某些功能的内存。
    共享多堆的使用如下:

    • 在初始化时,一些平台代码使用shared_multi_heap_pool_init()初始化共享的多堆框架,并使用shared_multi_heap_add()将内存区域添加到池中,可能从设备树收集区域所需的信息。
    • 每个内存区域都编码在shared_multi_heap_region结构中。此结构还带有一个不透明且用户定义的整数值,该值用于定义区域功能(例如:可缓存性、CPU 关联性等)。 ```c // Init the shared multi-heap pool shared_multi_heap_pool_init()

    // Fill the struct with the data for cacheable memory struct shared_multi_heap_region cacheable_r0 = { .addr = addr_r0, .size = size_r0, .attr = SMH_REG_ATTR_CACHEABLE, };

    // Add the region to the pool shared_multi_heap_add(&cacheable_r0, NULL);

    // Add another cacheable region struct shared_multi_heap_region cacheable_r1 = { .addr = addr_r1, .size = size_r1, .attr = SMH_REG_ATTR_CACHEABLE, };

    shared_multi_heap_add(&cacheable_r0, NULL);

    // Add a non-cacheable region struct shared_multi_heap_region non_cacheable_r2 = { .addr = addr_r2, .size = size_r2, .attr = SMH_REG_ATTR_NON_CACHEABLE, };

    shared_multi_heap_add(&non_cacheable_r2, NULL);

    1. - 当驱动程序或应用程序需要一些具有特定功能的动态内存时,它可以使用`shared_multi_heap_alloc()`来请求内存,方法是使用`不透明且用户定义的整数值`。框架将负责根据不透明且用户定义的整数值和堆的运行时状态(可用内存,堆状态等)选择正确的堆(因此内存区域)来申请内存。
    2. ```c
    3. // Allocate 4K from cacheable memory
    4. shared_multi_heap_alloc(SMH_REG_ATTR_CACHEABLE, 0x1000);
    5. // Allocate 4K from non-cacheable memory
    6. shared_multi_heap_alloc(SMH_REG_ATTR_NON_CACHEABLE, 0x1000);
    • 当堆使用完成后需要调用shared_multi_heap_free()来释放堆

    关于不透明且用户定义的整数值,系统内部目前提供了两个:

    • SMH_REG_ATTR_CACHEABLE: 可缓存
    • SMH_REG_ATTR_NON_CACHEABLE: 不可缓存

    我们也可以自己添加。