linux DMA接口知识点详解

1.两种DMA映射类型

1.1. 一致性DMA映射(Consistent DMA mappings )

主要用于映射长时间使用的区域。

CPU和DMA controller不需要考虑cache的影响。

这里的consistent实际上是coherent的概念,不能保证consistent,也就是说需要memory barrier来保证memory order。

1.2 流式DMA映射(streaming DMA mapping)

主要用于一次性DMA传输,传输完成后就会释放。

2.指定DMA设备的寻址范围

include/linux/dma-mapping.h

// 用于一致性内存映射的映射范围
static inline int dma_set_coherent_mask(struct device *dev, u64 mask)
// 用于流式内存映射的映射范围
static inline int dma_set_mask(struct device *dev, u64 mask);

3.DMA映射接口

3.1一致性DMA接口

分配较大DMA buffer

// dev        DMA控制器设备
// size        要分配的DMA buffer大小
// dma_handle  返回DMA buf的物理地址
// flag        分配标志
// 返回值       DMA buffer的虚拟地址
void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag) 

// dev        DMA控制器设备
// size        释放的DMA buffer大小
// cpu_addr    DMA buf的虚拟地址
// dma_handle  DMA buf的物理地址
void dma_free_coherent(struct device *dev, size_t size,
    void *cpu_addr, dma_addr_t dma_handle)

分配较小DMA buffer,从dma poll中申请。

/**
 * dma_pool_alloc - 从dma poll获得一块一致性内存
 * @pool: 产生内存块的dma pool
 * @mem_flags: GFP_* bitmask
 * @handle: 返回内存块的dma地址
 */
void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags,
       dma_addr_t *handle)

/**
 * dma_pool_free - 将内存释放回dma pool
 * @pool:产生内存块的dma pool
 * @vaddr: 内存块的虚拟地址
 * @dma: 内存块的物理地址
 */
void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t dma)

3.2 流式DMA接口

// dev    需要映射内存的设备
// ptr     映射的buffer虚拟地址
// size    映射的大小
// dir     传输方向
// attr    属性
// 返回值   dma物理地址
dma_addr_t dma_map_single_attrs(struct device *dev, void *ptr,
             size_t size,
             enum dma_data_direction dir,
             unsigned long attrs)
// dev    需要映射内存的设备
// addr   dma区域的物理地址
// size    映射的大小
// dir     传输方向
// attr    属性
void dma_unmap_single_attrs(struct device *dev, dma_addr_t addr,
           size_t size,
           enum dma_data_direction dir,
           unsigned long attrs)

page映射

dma_addr_t dma_map_page(struct device *dev, struct page *page,
           size_t offset, size_t size,
           enum dma_data_direction dir)

void dma_unmap_page(struct device *dev, dma_addr_t addr,
         size_t size, enum dma_data_direction dir)

返回dma映射错误

// 返回dma映射错误
int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)

映射scatterlist

int dma_map_sg_attrs(struct device *dev, struct scatterlist *sg,
          int nents, enum dma_data_direction dir,
          unsigned long attrs)

void dma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg,
           int nents, enum dma_data_direction dir,
           unsigned long attrs)

// 返回map后的dma地址和长度
sg_dma_address(struct scatterlist *sg)
sg_dma_len(struct scatterlist *sg)

sync操作

void dma_sync_single_for_cpu(struct device *dev, dma_addr_t addr,
size_t size,
enum dma_data_direction dir)

void dma_sync_single_for_device(struct device *dev,
dma_addr_t addr, size_t size,
enum dma_data_direction dir)

void
dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg,
int nelems, enum dma_data_direction dir)

void
dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,
int nelems, enum dma_data_direction dir)

以上就是本次介绍的全部相关知识点,如果大家有任何补充可以联系我们小编。

(0)

相关推荐

  • linux下python使用sendmail发送邮件

    本文实例为大家分享了python使用sendmail发送邮件的具体代码,供大家参考,具体内容如下 参考链接:How do I send mail from a Python script? 使用linux下的sendmail程序来发送邮件,利用popen函数(python docs关于popen函数)可以直接调用linux系统程序,需要指定程序所在的位置. python代码: #!/usr/bin/python # -*- coding: UTF-8 -*- #Author: Victor Lv

  • 详解linux dma驱动编写

    linux下面的驱动虽然什么样的情形都有,但是dma驱动却并不少见.dma可以有很多的好处,其中最重要的功能就是能够帮助我们将数据搬来搬去,这个时候cpu就由时间去做别的事情了,提高了设备效率. 1.dma驱动在什么地方 drivers/dma 2.如何看s3c的dma驱动,先看Kconfig config S3C24XX_DMAC bool "Samsung S3C24XX DMA support" depends on ARCH_S3C24XX || COMPILE_TEST se

  • linux DMA接口知识点详解

    1.两种DMA映射类型 1.1. 一致性DMA映射(Consistent DMA mappings ) 主要用于映射长时间使用的区域. CPU和DMA controller不需要考虑cache的影响. 这里的consistent实际上是coherent的概念,不能保证consistent,也就是说需要memory barrier来保证memory order. 1.2 流式DMA映射(streaming DMA mapping) 主要用于一次性DMA传输,传输完成后就会释放. 2.指定DMA设备

  • Linux netfilter/iptables知识点详解

    Netfilter Netfilter是Linux内核中的一个数据包处理模块,它可以提供数据包的过滤.转发.地址转换NAT功能.Iptables是一个工具,可以用来在Netfilter中增加.修改.删除数据包处理规则. Netfilter是位于网卡和内核协议栈之间的一堵墙,是一种免费的软件防火墙. Netfilter中有三个主要的概念:规则.表.链,等级依次递增. 规则是对特定报文的处理说明,包括匹配字段和action. 链是一组规则的集合. 表是链中相同功能的规则集合. 规则 链 链可以看作网

  • Linux 远程管理及sshd服务验证知识点详解

    一.SSH远程管理 SSH定义 SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录.远程复制等功能. SSH协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令.因此SSH协议具有很好的安全性. SSH优点 数据传输是加密的,可以防止信息泄漏 数据传输是压缩的,可以提高传输速度 SSH配置文件 sshd 服务的默认配置文件是/etc/ssh/sshd_config ssh_config和sshd_config都是ssh服务器的配置文件 二者区

  • 基于java集合中的一些易混淆的知识点(详解)

    (一) collection和collections 这两者均位于java.util包下,不同的是: collection是一个集合接口,有ListSet等常见的子接口,是集合框架图的第一个节点,,提供了对集合对象进行基本操作的一系列方法. 常见的方法有: boolean add(E e) 往容器中添加元素:int size() 返回collection的元素数:boolean isEmpty() 判断此容器是否为空: boolean contains(Object o) 如果此collecti

  • nodejs中的异步编程知识点详解

    简介 因为javascript默认情况下是单线程的,这意味着代码不能创建新的线程来并行执行.但是对于最开始在浏览器中运行的javascript来说,单线程的同步执行环境显然无法满足页面点击,鼠标移动这些响应用户的功能.于是浏览器实现了一组API,可以让javascript以回调的方式来异步响应页面的请求事件. 更进一步,nodejs引入了非阻塞的 I/O ,从而将异步的概念扩展到了文件访问.网络调用等. 今天,我们将会深入的探讨一下各种异步编程的优缺点和发展趋势. 同步异步和阻塞非阻塞 在讨论n

  • java伪泛型知识点详解

    说明 1.Java中的泛型是伪泛型.这种泛型实现方法称为类型擦除 ,基于这种方法实现的泛型称为伪泛型. 2.由于Java的泛型只在编译阶段发挥作用,因此在写代码时,起到了检查的作用,当代码运行时,它的内部并没有泛型. 实例 List<String> l1 = new ArrayList<String>(); List<Integer> l2 = new ArrayList<Integer>(); System.out.println(l1.getClass(

  • python PaddleOCR库用法及知识点详解

    说明 1.PaddleOCR是基于深度学习的ocr识别库,中文识别精度相当还不错,能够应对大多数文字提取需求. 2.需要依次安装三个依赖库,shapely库可能会受到系统的影响,出现安装错误. 安装命令 pip install paddlepaddle pip install shapely pip install paddleocr 代码实现 ocr = PaddleOCR(use_angle_cls=True,) # 输入待识别图片路径 img_path = r"d:\Desktop\4A3

  • Java字节码增强技术知识点详解

    简单介绍下几种java字节码增强技术. ASM ASM是一个Java字节码操控框架,它能被用来动态生成类或者增强既有类的功能.ASM可以直接产生class文件,也可以在类被加载入Java虚拟机之前动态改变类行为.ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类. 主页:https://asm.ow2.io/index.html ASM框架中的核心类有以下几个: ① ClassReader:该类用来解析编译过的class字节码文件. ② ClassWriter:

  • python中subprocess实例用法及知识点详解

    1.subprocess这个模块来产生子进程,并且可以连接到子进程的标准输入.输出.错误中,还可以获得子进程的返回值. 2.subprocess提供了2种方法调用子程序. 实例 # coding:utf-8 import os # popen返回文件对象,同open操作一样 f = os.popen(r"ls", "r") l = f.read() print(l) f.close() Python subprocess知识点扩充 使用subprocess模块的目的

  • Spring的事件机制知识点详解及实例分析

    同步事件和异步事件 同步事件: 在一个线程里,按顺序执行业务,做完一件事再去做下一件事. 异步事件: 在一个线程里,做一个事的同事,可以另起一个新的线程执行另一件事,这样两件事可以同时执行. 用一个例子来解释同步事件和异步事件的使用场景,有时候一段完整的代码逻辑,可能分为几部分,拿最常见的注册来说,假设完整流程是,1.点击注册->2.检验信息并存库->3.发送邮件通知->4.返回给用户.代码这么写是正确,但不是最好的,缺点如下: 逻辑复杂,业务耦合,我们把校验数据并存库和发送邮件写到一个

随机推荐