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

6

图形处理器(GPUs)和视频处理器(VPUs)需要连续的内存。

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

为什么这里需要连续内存?


它与性能有什么关系?您能否解释一下,它如何取决于设备驱动程序。 - Pankaj Suryawanshi
1
许多设备直接使用内存,而不考虑MMU。这些设备使用物理地址来管理内存区域,因此需要这些区域在物理上是连续的。 - Tsyvarev
你正在混淆连续的虚拟内存和连续的物理内存。内存分配总是连续的虚拟内存。如果你的系统有IOMMU,你可能不会问这个问题。 - sawdust
@sawdust,基本原则是虚拟连续并不总等同于物理连续,在cma的情况下,虚拟连续等同于物理连续。那么我的问题是为什么需要物理连续?有哪些优缺点? - Pankaj Suryawanshi
当配置完成后,设备使用内存区域起始物理地址和该内存区域的大小。这些参数仅适用于物理上连续的区域。“为什么硬件需要连续的内存?” - 如果不指定设备的具体类型,这个问题对于 Stack Overflow 来说将会过于宽泛 - Tsyvarev
显示剩余6条评论
1个回答

9

连续内存分配(CMA)是为需要使用连续物理内存范围的I/O设备所需的。只能使用连续范围的I/O设备是为了简化设备的设计。

在具有I/O内存管理单元(IOMMU)的系统上,这不是问题,因为在设备地址空间中连续的缓冲区可以由IOMMU映射到非连续的物理内存区域。此外,某些设备可以进行{{link1:散布/聚集DMA}}(即可以从/写入多个非连续缓冲区)。理想情况下,所有I/O设备都应该设计为要么在IOMMU后面工作,要么具有散布/聚集DMA的能力。不幸的是,情况并非如此,存在需要物理连续缓冲区的设备。设备驱动程序有两种方法来分配连续缓冲区:

  • 设备驱动程序可以在启动时分配一块物理内存。这是可靠的,因为大多数物理内存在启动时都可用。但是,如果I/O设备没有使用,则分配的物理内存将被浪费。
  • 可以按需分配一块物理内存,但可能很难找到所需大小的连续空闲范围。然而,优点是只有在需要时才分配内存。

CMA通过提供这两种方法的优点来解决这个问题,同时不会出现它们的缺点。基本思想是使得可能迁移已分配的物理页面以创建足够的空间来存储连续缓冲区。有关CMA如何工作的更多信息,请单击此处


但为什么需要物理上连续的内存? - Pankaj Suryawanshi
@PankajSuryawanshi 答案就在第一句话中。哪部分答案不清楚? - Hadi Brais
我的问题是为什么I/O设备只能使用连续的物理内存范围? - Pankaj Suryawanshi
@PankajSuryawanshi 因为这会导致更简单的设计,设备只需要处理一个物理地址而不是多个物理地址。 - Hadi Brais

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接