dma_alloc_coherent
是 Linux 内核中用于分配 DMA(直接内存访问)一致性内存的函数。它确保分配的内存可以被设备安全地访问,同时在 CPU 和设备之间保持数据的一致性。
以下是 dma_alloc_coherent
的使用示例:
示例代码
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/dma-mapping.h>
#include <linux/slab.h>
struct my_device {
void *buf; // 用于保存DMA缓冲区指针
dma_addr_t dma_handle; // DMA地址
};
static struct my_device *dev;
static int __init my_driver_init(void)
{
// 分配并初始化设备结构
dev = kmalloc(sizeof(struct my_device), GFP_KERNEL);
if (!dev) {
pr_err("Failed to allocate device structure\n");
return -ENOMEM;
}
// 分配DMA一致性内存
dev->buf = dma_alloc_coherent(NULL, 1024, &dev->dma_handle, GFP_KERNEL);
if (!dev->buf) {
pr_err("Failed to allocate coherent DMA memory\n");
kfree(dev);
return -ENOMEM;
}
pr_info("Allocated coherent DMA memory at address: %p\n", dev->buf);
// ... (使用DMA缓冲区)
return 0;
}
static void __exit my_driver_exit(void)
{
// 释放DMA一致性内存
if (dev && dev->buf) {
dma_free_coherent(NULL, 1024, dev->buf, dev->dma_handle);
pr_info("Freed coherent DMA memory\n");
}
kfree(dev);
}
module_init(my_driver_init);
module_exit(my_driver_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Example of using dma_alloc_coherent");
MODULE_AUTHOR("Your Name");
使用说明
包含头文件:需要包含
<linux/dma-mapping.h>
来使用dma_alloc_coherent
和dma_free_coherent
函数。结构体定义:我们定义了一个简单的设备结构体,包含了用于保存 DMA 缓冲区指针和其对应 DMA 地址的成员。
模块初始化:
- 在
my_driver_init()
函数中,我们首先分配了一个设备结构体。 - 然后调用
dma_alloc_coherent()
函数来分配一个 1024 字节的连续内存块,并获取其 DMA 地址。注意,第二个参数指定所需字节数,第三个参数是用来返回分配得到的 DMA 地址,第四个参数为分配标志(一般使用GFP_KERNEL
)。
- 在
模块退出:
- 在
my_driver_exit()
函数中,我们释放之前通过dma_alloc_coherent()
分配的内存,并且要传入相应的参数,包括虚拟地址和 DMA 地址。
- 在
注意事项
- 确保在实际驱动开发中,根据具体情况选择合适的上下文和标志。
- 在多线程环境下,特别是在涉及到硬件操作时,请确保对共享资源进行适当同步。
- 正确管理内存,以避免泄漏。
内容由零声教学AI助手提供,问题来源于学员提问