Linux DMA访问的一致性
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访问的一致性的更多相关文章
- DMA及cache一致性的学习心得 --dma_alloc_writecombine【转】
转自:https://www.cnblogs.com/hoys/archive/2012/02/17/2355914.html 来源:http://xmxohy.blog.163.com/blog/s ...
- 【转】DMA和cache一致性
DMA和cache一致性问题 Cache原理 CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多.缓存的出现主要是为了解决CPU ...
- .NET跨平台之旅:基于.NET Core改写EnyimMemcached,实现Linux上访问memcached缓存
注:支持 .NET Core 的 memcached 客户端 EnyimMemcachedCore 的 NuGet 包下载地址:https://www.nuget.org/packages/Enyim ...
- linux查看访问windows共享目录NT_STATUS_DUPLICATE_NAME问题解决
linux查看访问windows共享目录NT_STATUS_DUPLICATE_NAME问题解决 [jason@superfreak ~]$ smbclient //powerhouse-smb.my ...
- Linux内核访问外设I/O--动态映射(ioremap)和静态映射(map_desc) (转载)
[转](转)Linux内核访问外设I/O资源的方式-静态映射(map_desc)方式 Linux内核访问外设I/O资源的方式 Author: Dongas Date: 08-08-02 我们知道默认外 ...
- Linux 终端访问 FTP 及 上传下载 文件
今天同事问我一个问题,在Linux 下访问FTP,并将文件上传上去. 我之前一直是用WinSCP工具的. 先将文件从linux copy到windows下,然后在传到ftp上.google 一下. 方 ...
- windows下使用远程工具登录虚拟机上的Linux、访问虚拟机上的服务 、端口转发、win7 telnet登陆虚拟机
首先要清楚virtual box如何设置端口转发: 一篇文章: 如何使用VirtualBox进行端口转发 由于默认的方式是用NAT来做虚拟机网络的,因此如果从外网想访问虚拟机的应用会比较麻烦.以前一直 ...
- 在Linux下访问Windows共享目录的配置方法
在Linux下访问Windows共享目录的配置方法 1.在Windows上设置一个共享目录 如:将d:\RedHat_disk设置为共享目录 2.在Windows上创建一个用户,如tommy,密码11 ...
- Linux怎样访问Windows共享文件和文件夹
常常使用Windows的人可能会发现,Windows计算机之前共享资料非常方便,但是有时候想玩玩Linux的时候,如Fedora.Ubuntu.CentOS等,该怎样才能访问Windows计算机上的文 ...
随机推荐
- DjangoBBS项目功能拆分
目录 1.随机验证码 2.注册功能 3.登录功能 4.登录认证装饰器配置 5.修改密码模态框方法 6.修改头像 7.修改签名模态框方法 8.注销功能模态框 9.用户上传静态文件配置 10.图片防盗链 ...
- [github]添加fork me标识
下午用python在命令行画超载鸡,累死,以后慢慢再改吧. 偶然见看到别人博客园右上角有github的fork me图标,就找找,自己也弄上. 直接给官方博客地址:地址 复制添加到需要的页面源码中,把 ...
- 请转发!简单2分钟制作无接触式小区进出微信登记表!全免费!数据安全!所有数据均存在创建人登录的QQ腾讯文档里!
全免费!数据安全!所有数据均存在创建人登录的QQ腾讯文档里! 阻击疫情到了最吃劲的关键期,大家能不出门就不出门,但免不了出去买个菜.取个快递啥的,每次出入的时候,社区同志都在认真拿着笔记录每个进出信息 ...
- Codeforces 1060C Maximum Subrectangle(子矩阵+预处理)
题意:给出数组a,b,组成矩阵c,其中$c_{ij}=a_i*b_j$,找出最的大子矩阵,使得矩阵元素和<=x,求这个矩阵的size n,m<=2000 思路:对于子矩阵(l1...r1) ...
- 《Python学习手册 第五版》 -第10章 Python语句简介
前面在开始讲解数据类型的时候,有说过Python的知识结构,在此重温一下 Python知识结构: 程序由模块组成 模块包含语句 语句包含表达式 表达式创建并处理对象 关于知识结构,前面已经说过我自己的 ...
- shellcode 反汇编,模拟运行以及调试方法
onlinedisassembler https://onlinedisassembler.com 在线反汇编工具,类似于lda.功能比较单一. Any.run 等平台在线分析 将shellcode保 ...
- D语言-认识D语言&安装
Part1: Something about "D" D语言在国外比较流行,在国内相当少的人才知道这个语言的存在 但是D语言有C++的效率,有Java的灵活 更重要的有两点: 1. ...
- thinkphp远程执行漏洞的本地复现
thinkphp远程执行漏洞的本地复现 0X00漏洞简介 由于ThinkPHP5 框架控制器名 没有进行足够的安全监测,导致在没有开启强制路由的情况下,可以伪装特定的请求可以直接Getshell(可以 ...
- 杭电-------2053Switch Game(C语言)
/* 题目大意是指:有n个灯泡,按1-n编号,要操作n次,第i次操作是将标号是i的倍数的变成相反状态.最终求得是n次操作后,编号为n的灯泡的状态,其实就是求n的约束有多少个,及灯泡n被操作了多少次*/ ...
- MATLAB添加工具箱及无法连接到MathWorks问题
版本信息:官网下载的MATLAB R2019b 学生版 操作系统:Windows 10 在安装MATLAB时,需要我们自行选择要安装工具箱,如何在已安装MATLAB后添加当初没有选择安装的工具箱呢?第 ...