使用堆分配 dma-buf

Dma-buf 堆是用户空间分配 dma-buf 对象的一种方式。它们通常用于从特定的分配池中分配缓冲区,或在不同框架之间共享缓冲区。

一个堆代表一个特定的分配器。Linux 内核目前支持以下堆

  • The system 堆分配虚拟连续、可缓存的缓冲区。

  • The system_cc_shared 堆使用共享(已解密)内存分配虚拟连续、可缓存的缓冲区。它仅存在于启用内存加密的机密计算 (CoCo) 虚拟机(例如 AMD SEV, Intel TDX)上。已分配页面的加密位被清除,使其可在没有 TDISP 支持的情况下供设备 DMA 访问。在非 CoCo 虚拟机配置上,不会注册此堆。

  • The default_cma_region 堆分配物理连续、可缓存的缓冲区。仅在存在 CMA 区域时才存在。此类区域通常通过内核命令行参数 cma、设置了 linux,cma-default 属性的内存区域设备树节点,或者通过 CMA_SIZE_MBYTESCMA_SIZE_PERCENTAGE Kconfig 选项来创建。在 Linux 6.17 之前,其名称并不稳定,根据平台的不同,可能被称为 reservedlinux,cmadefault-pool

  • 设备树中每个具有 shared-dma-pool compatible 属性的可重用区域都将创建一个堆,并使用完整的设备树节点名称作为其名称。缓冲区语义与 default-cma-region 相同。

命名约定

dma-buf 堆的名称应满足若干约束

  • 名称必须稳定,且不得在不同版本之间发生变化。用户空间通过名称来识别堆,因此如果名称发生更改,我们很可能会引入回归(regression)。

  • 名称必须描述堆将从中进行分配的内存区域,并且必须在给定平台上唯一标识它。由于用户空间应用程序使用堆名称作为判别依据,因此如果存在多个堆,它必须能够可靠地分辨出它想要使用哪个堆。

  • 名称不得提及实现细节,例如分配器。堆驱动程序会随着时间而变化,引入时的实现细节在未来可能不再相关。

  • 名称应描述将要分配的缓冲区的属性。这样做将使用户空间更容易识别堆。此类属性包括

    • 用于物理连续缓冲区的 contiguous

    • 用于操作系统无法访问的加密缓冲区的 protected

  • 名称可以描述预期的用途。这样做将使用户空间应用程序和用户更容易识别堆。

例如,假设一个平台有一个位于 RAM 地址 0x42000000 的保留内存区域,旨在分配视频帧缓冲区、物理连续,并由 CMA 内核分配器支持,那么好的名称应该是 memory@42000000-contiguousvideo@42000000,但 cma-video 则不合适。