dma_alloc_coherent在arm中大小有限制,大概为2M。分配的内存在内核中以链表的形式存在。如果分配大小不一的内存造成碎片或其它程序也在用dma_alloc_coherent,则分配失败也是正常的。当然理论上你可以修改区间大小,但是我没试过。
dma_alloc_coherent()函数是为了达到一致性内存的目的,它分配指定大小的一致性内存,其物理起始地址存放在dma_handle中,函数返回值为这段内存的虚拟起始地址。 dma_alloc_coherent()函数返回的虚拟地址尽量是非缓存的,这样设备向这块地址放数据包,OS响应中断后可以从这块地址拿包。
dma_alloc_coherent函数的原型如下: c void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t flag); 该函数接受四个参数: - struct device *dev:指向设备结构体的指针,用于标识进行DMA传输的设备。 - size_t size:需要分配的内存区域的大小。 - dma_addr_t *handle:...
在项目驱动过程中会经常用到dma传输数据,而dma需要的内存有自己的特点,一般认为需要物理地址连续,并且内存是不可cache的,在linux内核中提供一个供dma所需内存的申请函数dma_alloc_coherent. 如下所述: dma_alloc_coherent() dma_alloc_coherent() -- 获取物理页,并将该物理页的总线地址保存于dma_handle,返回该物...
dma_alloc_coherent函数的原型为: c void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag); 该函数接收四个参数: - dev:表示目标设备的struct device结构体指针,用于确定需要分配的内存空间的属性,该参数通常由设备驱动程序传入。 - size:表示需要分配的内存空间...
5 // 返回值 DMA buffer的虚拟地址6 void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag) 7 8 // dev DMA控制器设备 9 // size 释放的DMA buffer大小 10 // cpu_addr DMA buf的虚拟地址 ...
dma_alloc_coherent() dma_alloc_coherent() -- 获取物理页,并将该物理页的总线地址保存于dma_handle,返回该物理页的虚拟地址 DMA映射建立了一个新的结构类型---dma_addr_t来表示总线地址。dma_addr_t类型的变量对驱动程序是不透明的;唯一允许的操作是将它们传递给DMA支持例程以及设备本身。作为一个总线地址,如...
这样, dma_alloc_writecombine 分配出来的内存不使用缓存,但是会使用写缓冲区。 而dma_alloc_coherent 则二者都不适用。 由此,再去理解 LDD3上讲解的一致性 DMA映射 与流式 DMA 映射就比较容易了,一致性 DMA映射(dma_alloc_coherent )调用的是上面的函数, 由于关闭了 cache/buffer,性能自然比较低。 而流式则通...
dma_pool_free释放DMA内存到DMA内存池中 dma_pool_destroy销毁DMA内存池 2.1 一致性内存相关接口介绍及替换 2.1.1 分配一致性内存 1)Linux接口介绍 Linux内核提供相应接口用于分配一个DMA一致性的内存区域。 void *dma_alloc_coherent(struct device *dev, ...
要取消映射和释放这样的 DMA 区域,请调用: dma_free_coherent(dev, size, cpu_addr, dma_handle); 其中dev、size 与上述调用中的相同,而 cpu_addr 和 dma_handle 是 dma_alloc_coherent() 返回给您的值。该函数不能在中断上下文中调用。 如果您的驱动程序需要大量较小的内存区域,您可以编写自定义代码来细分...