【问题标题】:Why Contiguous memory allocation is required in linux?为什么在linux中需要连续内存分配?
【发布时间】:2019-06-02 13:44:27
【问题描述】:

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

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

为什么需要连续内存?

【问题讨论】:

  • 这取决于具体设备的驱动程序,但可能与性能原因有关。
  • 它与性能有何关系?你能解释一下,它如何依赖于设备驱动程序。
  • 许多设备直接使用内存,忽略 MMU。此类设备将物理地址用于内存区域,因此要求这些区域在物理上是连续的。
  • 您将连续的虚拟内存与连续的物理内存混为一谈。内存分配始终是连续的虚拟内存。如果你的系统有 IOMMU,你可能不会问这个问题。
  • 我相信原因之一是DMA。硬件需要一块连续的内存。此外,显卡使用双缓冲区或三缓冲区。我想如果不能通过交换指针来交换缓冲区(而不是复制碎片缓冲区),那将是非常低效的。

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


【解决方案1】:

只能使用连续物理内存范围的 I/O 设备需要连续内存分配 (CMA)。在具有 I/O 内存管理单元 (IOMMU) 的系统上,这不是问题,因为 IOMMU 可以将设备地址空间中连续的缓冲区映射到物理内存的非连续区域。还有一些设备可以做scatter/gather DMA(即,可以读/写多个非连续缓冲区)。理想情况下,所有 I/O 设备都应设计为在 IOMMU 之后工作,或者应该能够分散/收集 DMA。不幸的是,情况并非如此,有些设备需要物理上连续的缓冲区。设备驱动程序有两种分配连续缓冲区的方法:

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

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

【讨论】:

  • 但是为什么需要物理上连续的内存呢?
  • @PankajSuryawanshi 答案就在第一句话中。答案的哪一部分不清楚?
  • 我的问题是为什么 I/O 设备只能使用连续的物理内存范围?
  • @PankajSuryawanshi 因为它带来了更简单的设计,设备只需处理单个物理地址而不是多个物理地址。
猜你喜欢
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 2019-04-20
  • 2013-11-14
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多