为什么 linux 中需要连续内存分配?
Why Contiguous memory allocation is required in linux?
大多数设备需要连续内存。例如GPU、VPU。
CMA和静态内存分配是连续内存的例子。
为什么需要连续内存?
I/O 只能使用连续物理内存范围的设备需要连续内存分配 (CMA)。在具有 I/O 内存管理单元 (IOMMU) 的系统上,这不是问题,因为 IOMMU 可以将设备地址 space 中连续的缓冲区映射到 non-contiguous 区域的物理内存。还有一些设备可以做 scatter/gather DMA(即可以 read/write from/to 多个 non-contiguous 缓冲区)。理想情况下,所有 I/O 设备都应设计为在 IOMMU 后面工作或应该能够 scatter/gather DMA。不幸的是,情况并非如此,有些设备需要物理上连续的缓冲区。设备驱动程序有两种分配连续缓冲区的方法:
- 设备驱动程序可以在 boot-time 分配一块物理内存。这是可靠的,因为大多数物理内存在 boot-time 处可用。但是,如果 I/O 设备未被使用,那么分配的物理内存就被浪费了。
- 可以按需分配一块物理内存,但可能很难找到所需大小的连续空闲范围。不过,优点是内存仅在需要时分配。
CMA 通过结合这两种方法的优点和 none 的缺点来解决这个问题。基本思想是使迁移分配的物理页面成为可能,从而为连续缓冲区创建足够的 space。有关 CMA 如何工作的更多信息,请参见 here。
大多数设备需要连续内存。例如GPU、VPU。
CMA和静态内存分配是连续内存的例子。
为什么需要连续内存?
I/O 只能使用连续物理内存范围的设备需要连续内存分配 (CMA)。在具有 I/O 内存管理单元 (IOMMU) 的系统上,这不是问题,因为 IOMMU 可以将设备地址 space 中连续的缓冲区映射到 non-contiguous 区域的物理内存。还有一些设备可以做 scatter/gather DMA(即可以 read/write from/to 多个 non-contiguous 缓冲区)。理想情况下,所有 I/O 设备都应设计为在 IOMMU 后面工作或应该能够 scatter/gather DMA。不幸的是,情况并非如此,有些设备需要物理上连续的缓冲区。设备驱动程序有两种分配连续缓冲区的方法:
- 设备驱动程序可以在 boot-time 分配一块物理内存。这是可靠的,因为大多数物理内存在 boot-time 处可用。但是,如果 I/O 设备未被使用,那么分配的物理内存就被浪费了。
- 可以按需分配一块物理内存,但可能很难找到所需大小的连续空闲范围。不过,优点是内存仅在需要时分配。
CMA 通过结合这两种方法的优点和 none 的缺点来解决这个问题。基本思想是使迁移分配的物理页面成为可能,从而为连续缓冲区创建足够的 space。有关 CMA 如何工作的更多信息,请参见 here。