首页 > 其他分享 >DMA pool

DMA pool

时间:2024-04-01 09:34:00浏览次数:18  
标签:DMA dma 内存 缓冲区 my pool

在Linux内核中,用于管理DMA内存池的相关函数通常包含在内核的DMA API中。以下是一些常见的DMA内存池管理函数:

struct dma_pool *dma_pool_create(const char *name, struct device *dev, size_t size, size_t align, size_t allocation);
功能:创建一个新的DMA内存池。
参数:
name:内存池的名称,用于标识该内存池。
dev:关联的设备结构体指针,通常是设备驱动中的设备对象。
size:每个DMA缓冲区的大小。
align:对齐方式,通常是硬件要求的对齐方式。
allocation:用于控制内存池的分配策略,通常为GFP_KERNEL或GFP_ATOMIC等标志位。
返回值:成功返回指向dma_pool结构体的指针,失败返回NULL。


void *dma_pool_alloc(struct dma_pool *pool, gfp_t flags, dma_addr_t *handle);
功能:从DMA内存池中分配一个DMA缓冲区。
参数:
pool:DMA内存池的指针,由dma_pool_create()函数返回。
flags:用于控制内存分配的标志位,通常是GFP_KERNEL或GFP_ATOMIC等。
handle:DMA地址的指针,用于返回分配的DMA地址。
返回值:成功返回分配的DMA缓冲区的虚拟地址,失败返回NULL。


void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t addr);
功能:释放之前分配的DMA缓冲区。
参数:
pool:DMA内存池的指针。
vaddr:要释放的DMA缓冲区的虚拟地址。
addr:DMA地址,通常是dma_pool_alloc()返回的地址。
返回值:无。


void dma_pool_destroy(struct dma_pool *pool);
功能:销毁之前创建的DMA内存池。
参数:
pool:DMA内存池的指针。
返回值:无。
这些函数在设备驱动程序中经常用于进行DMA操作时的内存分配和释放,提供了一种方便且高效的方式来管理DMA缓冲区的内存。在使用这些函数时,需要注意传入合适的参数并检查返回值以确保操作的正确性和稳定性。   DMA内存池使用伪代码:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/dma-mapping.h>

// 假设已经定义了一个设备结构体
struct device *my_device;

// 假设已经定义了一个DMA内存池指针
struct dma_pool *my_dma_pool;

static int __init my_init(void)
{
    size_t size = 4096; // DMA缓冲区的大小
    size_t align = 64;  // 对齐方式
    gfp_t flags = GFP_KERNEL; // 内存分配标志位

    // 创建DMA内存池
    my_dma_pool = dma_pool_create("my_dma_pool", my_device, size, align, flags);
    if (!my_dma_pool) {
        printk(KERN_ERR "Failed to create DMA pool\n");
        return -ENOMEM;
    }

    // 分配DMA缓冲区
    void *dma_buffer = dma_pool_alloc(my_dma_pool, flags, NULL);
    if (!dma_buffer) {
        printk(KERN_ERR "Failed to allocate DMA buffer\n");
        dma_pool_destroy(my_dma_pool);
        return -ENOMEM;
    }

    // 使用DMA缓冲区进行数据传输(此处省略具体操作)

    // 释放DMA缓冲区
    dma_pool_free(my_dma_pool, dma_buffer, 0);

    return 0;
}

static void __exit my_exit(void)
{
    // 销毁DMA内存池
    if (my_dma_pool) {
        dma_pool_destroy(my_dma_pool);
    }
}

module_init(my_init);
module_exit(my_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("lethe1203");
MODULE_DESCRIPTION("DMA pool demo");

 

       

标签:DMA,dma,内存,缓冲区,my,pool
From: https://www.cnblogs.com/lethe1203/p/18107761

相关文章

  • DMA cache一致性二
    参考资料:宋宝华:那些年你误会的LinuxDMA(关于LinuxDMAZONE和API最透彻的一篇)-CSDN博客https://blog.csdn.net/waterhawk/article/details/50723677https://www.linuxidc.com/Linux/2012-09/69591p2.htm注:本节有一些个人理解,如有误请谅解 dma_alloc_coherent与dma_alloc_wr......
  • Postfix + Dovecot IMAP 服务器的终极指南,完整支持 SPF、DKIM 和 DMARC,以及多域名设
    邮件服务器配置指南本指南将带您完成Postfix+DovecotIMAP服务器的设置,支持SPF、DKIM和DMARC,还将提供多域名配置的额外指导。在本指南中,domain.com将作为您的根域名,mail.domain.com将作为您邮件服务器的主机名。0x01添加DNS记录在您的域名下添加如下DNS记录:mailI......
  • LiftPool:双向池化操作,细节拉满,再也不怕丢特征了 | ICLR 2021
    论文参考信号处理中提升方案提出双向池化操作LiftPool,不仅下采样时能保留尽可能多的细节,上采样时也能恢复更多的细节。从实验结果来看,LiftPool对图像分类能的准确率和鲁棒性都有不错的提升,而对语义分割的准确性更能有可观的提升。不过目前论文还在准备开源阶段,期待开源后的复现,特......
  • 支付宝面试太太太刁钻了!!如果把线程池 corePoolSize 设置为 0,会出现什么情况?
    大家好,我是R哥。最近做Java面试辅导,有个学员面试支付宝,遇到一个特别有意思的问题:如果把线程池corePoolSize设置为0,会出现什么情况?这个问题一说出来,我都感觉有点***钻。。这几年我创作小程序:Java面试库,积累了2700+的Java面试题,什么***钻的面试题没见过?像这样的**......
  • Windows 安装 Podman Desktop
    简介: Podman(PODMANager)是一个用于管理容器和映像、挂载到这些容器中的卷以及由容器组组成的pod的工具。Podman在Linux上运行容器,但也可以使用Podman管理的虚拟机在Mac和Windows系统上使用。Podman基于libpod,libpod是一个用于容器生命周期管理的库,也包含在此存储......
  • podman 入门实战
     一入编程深似海,从此节操是路人。最近使用podman,就想着写一篇总结性的笔记,以备后续参考。就如同写代码,不写注释,过了一段时间可能会想这是我写的吗?不会吧,还要理一下逻辑才能读懂,不利于后期维护。感觉整体体验下来,镜像获取、容器创建、容器监控、容器移除,和docker差不多,感觉可......
  • STM32 串口 DMA 接收不定长数据的一种方法
    1.前言使用串口接收不定长数据时,可以有多种方法,比如最常见的有额外使能一个定时器,在超过定时范围未收到后续的字节时,认为此帧结束;或者利用IDLE中断,当数据空闲时,自动产生中断;亦或每接收到一个字节后都通过应用程序进行一次处理。这次我们介绍另外一种方法,在DMA方式下利......
  • stm32f103c8t6学习笔记(学习B站up江科大自化协)-DMA
    DMA简介    ·DMA主要用于协助CPU完成数据转运的工作    ·DMA,英文全称DirectMemoryAccess,DMA这个外设是可以直接访问STM32内部存储器的,包括运行内存SRAM,程序存储器flash和寄存器等等,DMA都有权限访问,所以DMA能完成数据转运的工作    ·第二行的外......
  • ThreadPool-线程池使用及原理
    1.线程池使用方式示例代码://一池N线程Executors.newFixedThreadPool(int)//一个任务一个任务执行,一池一线程Executors.newSingleThreadExecutorO//线程池根据需求创建线程,可扩容,遇强则强Executors.newCachedThreadPool()//自定义线程池方式newThreadPoolExec......
  • cubemx使用dma实现Uart不定长数据接收
    CubeMx版本: volatileuint8_trecv_end_flag=0;volatileuint32_trx_len=0;volatileuint32_trx_len2=0;uint8_trx_buffer[BUFFER_SIZE]={0};uint8_trx_buffer2[BUFFER_SIZE]={0};voidUSART1_IRQHandler(void){/*USERCODEBEGINUSART1_IRQn0*/......