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. Spring Boot 2.x基础教程:使用JdbcTemplate访问MySQL数据库

    在第2章节中,我们介绍了如何通过Spring Boot来实现HTTP接口,以及围绕HTTP接口相关的单元测试.文档生成等实用技能.但是,这些内容还不足以帮助我们构建一个动态应用的服务端程序.不论我们是 ...

  2. vue2.x中使用三元表达式绑定class的时候遇到的坑

    这个确实是个坑,而且是来自文档的坑. 首先先看文档对这个的解释: 从实际的代码书写上,文档中的写法,vs code没报错,但是浏览器报了一堆的错. 我试了很多遍,发现类名必须是要用引号引起来,页面上语 ...

  3. JDK 原生动态代理是怎么实现的 + 面试题

    JDK 原生动态代理是怎么实现的 + 面试题 反射 反射机制是 Java 语言提供的一种基础功能,赋予程序在运行时自省(introspect)的能力.简单来说就是通过反射,可以在运行期间获取.检测和调 ...

  4. Kafka网络模型和通信流程剖析

    1.概述 最近有同学在学习Kafka的网络通信这块内容时遇到一些疑问,关于网络模型和通信流程的相关内容,这里笔者将通过这篇博客为大家来剖析一下这部分内容. 2.内容 Kafka系统作为一个Messag ...

  5. Druid入门(1)—— 快速入门实时分析利器-Druid_0.17

    一.安装准备 本次安装的版本是截止2020.1.30最新的版本0.17.0 软件要求 需要Java 8(8u92 +)以上的版本,否则会有问题 Linux,Mac OS X或其他类似Unix的操作系统 ...

  6. C++ 自动类型推断

    C++语言提供了自动类型推断的机制,用于简化代码书写,这是一种很不错的特性,使用auto和decltype都可以完成自动类型推断的工作,而且都工作在编译期,这表示在运行时不会有任何的性能损耗. 一.a ...

  7. 解决Apple Mobile Device USB Driver

    在设备管理器里找到便携设备:APPLE IPHONE 更新驱动 自定义更新:在设备管理器里找到便携设备:APPLE IPHONE 更新驱动 自定义更新:C:\Program Files\Common ...

  8. Codeforces_708_A

    http://codeforces.com/problemset/problem/708/A 贪心,先把前面连续的一串'a'排除,再向后知道找到第一个'a',注意特殊情况. #include<i ...

  9. EMC NW disaster and recovery simulation 2

    scanner -ivp can help your new networker server recongize that only clone pool has data

  10. ASP.NET Core MVC 中实现中英文切换

    哈喽..大家好 很久没有更新了,今天就来一篇最近开发用到的功能,那就是中英文切换,这个实际上也不是高大上,先说一下原理,在.NET Core框架中给我们提供了全球化的类,叫做Localization, ...