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

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

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

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

为什么需要连续内存?

最佳答案

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

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

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

关于linux - 为什么在 linux 中需要连续内存分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56415606/

相关文章:

linux - 在服务器上运行时在本地计算机上显示

caching - Solr 的缓存是在 JVM 的堆内存中还是在堆外(直接)内存中创建的?

linux - epoll_event结构体(epoll)中参数的意义

Java/OpenJDK : How to add JAR to classpath

Linux shell CSV查看器工具可以卡住标题?

linux - 由 :Ambari Upgradation java. sql.SQLSyntaxErrorException: Unknown table 'hostcomponentstate' in information_schema 引起

c++ - 内存地址0x0是否可用?

c++ - 编译器如何知道使用哪个运算符或函数分配了哪个内存?

linux-kernel - Linux 设备树 (DTS) : i2c device on USB-I2C bridge

linux-kernel - 如何将平台特定数据从一个平台设备/驱动程序传递到另一个平台设备/驱动程序