dma_pool_zalloc 是 Linux 内核中的一个函数,用于从 DMA 内存池中分配并清零内存。它是 dma_pool_alloc 的一个变体,主要区别在于 dma_pool_zalloc 会自动将分配的内存初始化为零[1][3].
功能与用途
dma_pool_zalloc 的函数原型如下:
void *dma_pool_zalloc(struct dma_pool *pool, gfp_t mem_flags, dma_addr_t *handle)
这个函数主要用于:
- 从指定的 DMA 内存池中分配内存
- 自动将分配的内存清零
- 返回 CPU 可访问的虚拟地址
- 通过 handle 参数返回对应的 DMA 物理地址
dma_pool_zalloc 特别适用于需要分配小于 PAGE_SIZE 大小的 coherent 内存的场景[1].
DMA 内存池管理
DMA 内存池是 Linux 内核中用于管理 DMA 内存的一种机制,主要用于需要频繁分配小块 DMA 内存的场景。相关的函数包括:
-
创建内存池:
struct dma_pool *dma_pool_create(const char *name, struct device *dev, size_t size, size_t align, size_t alloc);
-
分配内存:
void *dma_pool_alloc(struct dma_pool *pool, gfp_t gfp_flags, dma_addr_t *dma_handle); void *dma_pool_zalloc(struct dma_pool *pool, gfp_t mem_flags, dma_addr_t *handle);
-
释放内存:
void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t addr);
-
销毁内存池:
void dma_pool_destroy(struct dma_pool *pool);
实际应用示例
在驱动开发中,dma_pool_zalloc 常用于分配 DMA 描述符或命令缓冲区:
-
DMA 控制器驱动:用于分配 DMA 传输描述符[2]
desc = dma_pool_zalloc(chan->desc_pool, GFP_ATOMIC, &pdesc);
-
网络设备驱动:如 Mellanox MLX5 驱动中用于分配消息缓冲区[3]
mailbox->buf = dma_pool_zalloc(dev->cmd.pool, GFP_KERNEL, &mailbox->dma);
-
显卡驱动:在 TTM 内存管理中用于分配命令缓冲区[5][6]
使用 dma_pool_zalloc 分配的内存已经绑定好虚拟地址和 DMA 物理地址,驱动程序只需填充相应的命令内容,然后提交给硬件执行即可[5].
优势
- 效率高:避免了频繁分配/释放页面级 DMA 内存的开销
- 自动清零:减少了手动初始化内存的步骤
- 内存对齐:确保分配的内存满足硬件对齐要求
- 简化管理:提供了统一的接口来管理小块 DMA 内存
Citations:
[1] https://blog.csdn.net/HT_77/article/details/124077109
[2] https://blog.csdn.net/weixin_44586903/article/details/136537865
[3] https://cloud.tencent.com/developer/article/2385650
[4] https://www.zhihu.com/question/494278454
[5] https://kknews.cc/zh-my/code/m5mpz5z.html
[6] https://kknews.cc/code/m5mpz5z.html