DMA访问的一致性

  DMA对内存是直接访问的,而CPU对内存的访问有时会通过cache。不管是CPU还是DMA访问内存,都需要确保cache的一致性。本文只分析从DMA的角度,对内存的访问如何确保cache的一致性。个人理解,通常为保证cache的一致性,在DMA访问内存前后,对cache要有下面必要的操作。

DMA读操作

  DMA从外设读取数据到内存时,因读取完成后内存数据改变,因此需要在读取完成后invalidate cache。

DMA写操作

  DMA将内存的数据写入外设时,在写之前,有可能cache中最新的数据并没有同步到内存,因此需要在写之前flush cache。

  如果硬件上支持DMA访问的一致性(dma-coherent),软件就不需要上述的cache操作。设备寄存器上通常会有DMA SNOOP的选项,来设置CPU cache是否窥探DMA的传输。

Linux一致性DMA映射和流式DMA映射  

  Linux动态DMA映射一文,简单介绍了DMA映射的两种类型及相关API:一致性DMA映射和流式DMA映射。它们有什么区别呢?

  使用一致性DMA映射,CPU和DMA看到的内存时一致的。通常在初始化阶段分配一致性buffer,默认分配的是uncached buffer,不使用cache就不存在一致性问题。如果SoC支持cache-coherent DMA,就可以分配cacheable buffer。

  使用流式DMA映射,在dma map和unmap的时候会根据数据方向来对cache进行正确的处理。在unmap之前,CPU一般不能直接访问相应内存。这一点在Linux动态DMA映射一文中有介绍。当然如果SoC支持cache-coherent DMA,dma map和unmap的时候就不必有软件的cache处理了。

  当CPU和DMA都需要频繁操作同一块内存的时候,使用一致性DMA映射比较合适。例如对基于描述符的DMA控制器(另一种DMA控制器是基于寄存器的),分配一致性buffer来存储描述符表,CPU可以对描述附表进行管理,DMA可以使用描述符表进行数据传输。(描述符表通常存储一些不连续的的内存区域的DMA总线地址及长度,这些地址和长度是通过散列表映射(dma_map_sg)得到的,详见Linux动态DMA映射一文。DMA拿到描述符表后,就可以一次访问最初散列表scatterlist描述的不连续的内存区了。)

Linux DMA访问的一致性的更多相关文章

  1. DMA及cache一致性的学习心得 --dma_alloc_writecombine【转】

    转自:https://www.cnblogs.com/hoys/archive/2012/02/17/2355914.html 来源:http://xmxohy.blog.163.com/blog/s ...

  2. 【转】DMA和cache一致性

    DMA和cache一致性问题 Cache原理 CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多.缓存的出现主要是为了解决CPU ...

  3. .NET跨平台之旅:基于.NET Core改写EnyimMemcached,实现Linux上访问memcached缓存

    注:支持 .NET Core 的 memcached 客户端 EnyimMemcachedCore 的 NuGet 包下载地址:https://www.nuget.org/packages/Enyim ...

  4. linux查看访问windows共享目录NT_STATUS_DUPLICATE_NAME问题解决

    linux查看访问windows共享目录NT_STATUS_DUPLICATE_NAME问题解决 [jason@superfreak ~]$ smbclient //powerhouse-smb.my ...

  5. Linux内核访问外设I/O--动态映射(ioremap)和静态映射(map_desc) (转载)

    [转](转)Linux内核访问外设I/O资源的方式-静态映射(map_desc)方式 Linux内核访问外设I/O资源的方式 Author: Dongas Date: 08-08-02 我们知道默认外 ...

  6. Linux 终端访问 FTP 及 上传下载 文件

    今天同事问我一个问题,在Linux 下访问FTP,并将文件上传上去. 我之前一直是用WinSCP工具的. 先将文件从linux copy到windows下,然后在传到ftp上.google 一下. 方 ...

  7. windows下使用远程工具登录虚拟机上的Linux、访问虚拟机上的服务 、端口转发、win7 telnet登陆虚拟机

    首先要清楚virtual box如何设置端口转发: 一篇文章: 如何使用VirtualBox进行端口转发 由于默认的方式是用NAT来做虚拟机网络的,因此如果从外网想访问虚拟机的应用会比较麻烦.以前一直 ...

  8. 在Linux下访问Windows共享目录的配置方法

    在Linux下访问Windows共享目录的配置方法 1.在Windows上设置一个共享目录 如:将d:\RedHat_disk设置为共享目录 2.在Windows上创建一个用户,如tommy,密码11 ...

  9. Linux怎样访问Windows共享文件和文件夹

    常常使用Windows的人可能会发现,Windows计算机之前共享资料非常方便,但是有时候想玩玩Linux的时候,如Fedora.Ubuntu.CentOS等,该怎样才能访问Windows计算机上的文 ...

随机推荐

  1. DjangoBBS项目功能拆分

    目录 1.随机验证码 2.注册功能 3.登录功能 4.登录认证装饰器配置 5.修改密码模态框方法 6.修改头像 7.修改签名模态框方法 8.注销功能模态框 9.用户上传静态文件配置 10.图片防盗链 ...

  2. [github]添加fork me标识

    下午用python在命令行画超载鸡,累死,以后慢慢再改吧. 偶然见看到别人博客园右上角有github的fork me图标,就找找,自己也弄上. 直接给官方博客地址:地址 复制添加到需要的页面源码中,把 ...

  3. 请转发!简单2分钟制作无接触式小区进出微信登记表!全免费!数据安全!所有数据均存在创建人登录的QQ腾讯文档里!

    全免费!数据安全!所有数据均存在创建人登录的QQ腾讯文档里! 阻击疫情到了最吃劲的关键期,大家能不出门就不出门,但免不了出去买个菜.取个快递啥的,每次出入的时候,社区同志都在认真拿着笔记录每个进出信息 ...

  4. Codeforces 1060C Maximum Subrectangle(子矩阵+预处理)

    题意:给出数组a,b,组成矩阵c,其中$c_{ij}=a_i*b_j$,找出最的大子矩阵,使得矩阵元素和<=x,求这个矩阵的size n,m<=2000 思路:对于子矩阵(l1...r1) ...

  5. 《Python学习手册 第五版》 -第10章 Python语句简介

    前面在开始讲解数据类型的时候,有说过Python的知识结构,在此重温一下 Python知识结构: 程序由模块组成 模块包含语句 语句包含表达式 表达式创建并处理对象 关于知识结构,前面已经说过我自己的 ...

  6. shellcode 反汇编,模拟运行以及调试方法

    onlinedisassembler https://onlinedisassembler.com 在线反汇编工具,类似于lda.功能比较单一. Any.run 等平台在线分析 将shellcode保 ...

  7. D语言-认识D语言&安装

    Part1: Something about "D" D语言在国外比较流行,在国内相当少的人才知道这个语言的存在 但是D语言有C++的效率,有Java的灵活 更重要的有两点: 1. ...

  8. thinkphp远程执行漏洞的本地复现

    thinkphp远程执行漏洞的本地复现 0X00漏洞简介 由于ThinkPHP5 框架控制器名 没有进行足够的安全监测,导致在没有开启强制路由的情况下,可以伪装特定的请求可以直接Getshell(可以 ...

  9. 杭电-------2053Switch Game(C语言)

    /* 题目大意是指:有n个灯泡,按1-n编号,要操作n次,第i次操作是将标号是i的倍数的变成相反状态.最终求得是n次操作后,编号为n的灯泡的状态,其实就是求n的约束有多少个,及灯泡n被操作了多少次*/ ...

  10. MATLAB添加工具箱及无法连接到MathWorks问题

    版本信息:官网下载的MATLAB R2019b 学生版 操作系统:Windows 10 在安装MATLAB时,需要我们自行选择要安装工具箱,如何在已安装MATLAB后添加当初没有选择安装的工具箱呢?第 ...