为什么在Linux中需要连续的内存分配?

时间:2019-06-02 13:44:27

标签: linux memory-management linux-kernel linux-device-driver embedded-linux

大多数设备需要连续的内存。例如GPU,VPU。

CMA和静态内存分配是连续内存的示例。

为什么需要连续内存?

1 个答案:

答案 0 :(得分:2)

仅可用于连续范围的物理内存的I / O设备需要连续的内存分配(CMA)。在具有I / O内存管理单元(IOMMU)的系统上,这不会成为问题,因为IOMMU可以将设备地址空间中连续的缓冲区映射到物理内存的不连续区域。另外,某些设备可以执行scatter/gather DMA(即可以从多个不连续的缓冲区读取/写入数据)。理想情况下,所有I / O设备都应设计为在IOMMU后面运行,或者应具有分散/聚集DMA的能力。不幸的是,情况并非如此,并且有些设备需要物理上连续的缓冲区。设备驱动程序有两种分配连续缓冲区的方法:

  • 设备驱动程序可以在引导时分配一块物理内存。这是可靠的,因为大多数物理内存将在引导时可用。但是,如果不使用I / O设备,则会浪费分配的物理内存。
  • 可以按需分配物理内存块,但是可能很难找到所需大小的连续可用范围。不过,优点是仅在需要时才分配内存。

CMA通过提供这两种方法的优点而没有缺点,解决了这个确切的问题。基本思想是使迁移已分配的物理页面以为连续缓冲区创建足够的空间成为可能。有关here的更多信息,请参见{{3}}。