有没有DMA Windows驱动的源代码?
在《深入理解Linux内核》中的第545页介绍了DMA的相关操作。说道DMA,那就不得不提到Cache(高速缓存)的问题。书中引用了如下一段例子来描述了Cache一致性问题:
逗假设设备驱动程序把一些数据填充到内存缓冲区中,然后立刻命令硬件设备利用DMA传送方式读取该数据。如果DMA访问这些物理RAM内存单元,而相应的硬件高速缓存行的内容还没有写入RAM中,那么硬件设备所读取的至就是内存缓冲区中的旧值。地
现在有两种方法来处理DMA缓冲区:
一致性DMA映射:
书上讲的比较抽象,通俗地所就是任何对DMA缓冲区的改写都会直接更新到内存中,也称之为逗同步的地或者逗一致的地。
流式DMA映射:
根据个人的理解,这里的流即输入输出流,我们需要事先指定DMA缓冲区的方向,比如是地读缓冲区地还是逗写缓冲区地。也称之为逗异步的地或逗非一致性的地,详细的内容请看下文。
由于x86体系结构中,硬件设备驱动程序本身会逗窥探地所访问的硬件告诉缓存,因此x86体系结构中不存在DMA一致性问题。而对于其他一些架构如MIPS,SPARC以及POWERPC(包括ARM在内)需要在软件上保证其DMA一致性。
对于以上两者如何选择,书中有一个合适的建议,如果CPU和DMA处理器以不可预知的方式去访问一个缓冲区,那么必须强制使用一致性DMA映射方式(这里我对不可预知的理解是,不能确定在何时它们访问缓冲区),其他情形下,流式DMA映射方式更可取,因为在一些体系结构中处理一致性DMA映射是很麻烦的,并且可能导致更低的系统性能。
这里详细介绍流式DMA:
需要访问的缓冲区需要在数据传送之前被映射(这里的映射也就是需要调用一些函数告知内核,该缓冲区进行流式映射),在传送之后被取消映射。
启动一次流式DMA数据传输分为如下步骤:
1. 分配DMA缓冲区。
在DMA设备不采用S/G(分散/聚集)模式的情况下,必须保证缓冲区是物理上连续的,linux内核有两个函数用来分配连续的内存:kmalloc()和__get_free_pages()。这两个函数都有分配连续内存的最大值,kmalloc以分配字节为单位,最大约为64KB,__get_free_pages()以分配页为单位,最大能分配2^order数目的页,order参数的最大值由include/linux/Mmzone.h文件中的MAX_ORDER宏决定(在默认的2.6.18内核版本中,该宏定义为10。也就是说在理论上__get_free_pages函数一次最多能申请1
2. 建立流式映射。
在对DMA冲区进行读写访问之后,且在启动DMA设备传输之前,启用dma_map_single()函数建立流式DMA映射,这两个函数接受缓冲区的线性地址作为其参数并返回相应的总线地址。
3. 释放流式映射。
当DMA传输结束之后我们需要释放该映射,这时调用dma_unmap_single()函数。
注意:
(1). 为了避免高速缓存一致性问题,驱动程序在开始从RAM到设备的DMA数据传输之前,如果有必要,应该调用dma_sync_single_for_device()函数刷新与DMA缓冲区对应的高速缓存行。
(2). 从设备到RAM的一次DMA数据传送完成之前设备驱动程序是不可以访问内存缓冲区的,但如果有必要的话,驱动程序在读缓冲区之前,应该调用dma_sync_single_for_cpu()函数使相应的硬件高速缓存行无效。
(3). 虽然kmalloc底层也是用__get_free_pages实现的,不过kmalloc对应的释放缓冲区函数为kfree,而__get_free_pages对应的释放缓冲区函数为free_pages。具体与__get_free_pages有关系的几个申请与释放函数如下:
申请函数:
alloc_pages(gfp_mask,order)返回第一个所分配页框描述符的地址,或者如果分配失败则返回NULL。__get_free_pages(gfp_mask,order)类似于alloc_pages(),但它返回第一个所分配页的线性地址。如果需要获得线性地址对应的页框号,那么需要调用virt_to_page(addr)宏产生线性地址。释放函数:__free_pages(page,order)这里主要强调page是要释放缓冲区的线性首地址所在的页框号free_pages(page,order)这个函数类似于__free_pages(page,order),但是它接收的参数为要释放的第一个页框的线性地址addr
以上是有没有DMA Windows驱动的源代码?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Windows 11 KB5054979 更新:安装指南及疑难解答 针对Windows 11 24H2版本,微软已发布累积更新KB5054979,包含多项改进和错误修复。本文将指导您如何安装此更新,并提供安装失败时的解决方法。 关于Windows 11 24H2 KB5054979 KB5054979于2025年3月27日发布,是针对Windows 11 24H2版本.NET Framework 3.5和4.8.1的安全更新。此更新增强了.NET Framework 3.5和4.8.1的安全性和

Microsoft Office中的“出问题了”错误标签7Q6CH在基本任务中破坏您的工作流程,例如创建文档或处理电子邮件,

GTA 5 Enhanced ERR_GFX_D3D_NOD3D12 错误修复指南 Grand Theft Auto V Enhanced (GTA 5 Enhanced) 是一款升级版游戏,但部分玩家在启动时遇到 “ERR_GFX_D3D_NOD3D12: 未找到 DirectX 12 适配器或运行库” 错误。本文提供几种解决方法。 错误原因: 此错误通常表示您的系统缺少 DirectX 12 运行库或兼容的 DirectX 12 显卡。 解决方法: 方法一:安装 DirectX 运行库 检

掌握AI限制的保存文件位置和保护:综合指南 计划潜入动感十足的科幻RPG,AI限制,在2025年3月27日启动? 了解您的保存文件位置并实施强大的保护方法是

找到您的时间表我保存文件对于管理和保护您的游戏进度至关重要。本指南向您展示了如何找到和备份保存数据。 我在哪里保存文件? 时间表我的早期访问发布已获得

2025年3月的补丁星期二更新,KB5053598,为Windows 11用户引起了广泛的问题。 许多报告RDP断开连接和蓝屏错误(BSOD)。本指南为这些问题提供了解决方案。 Windows 11 KB5053598更新:RDP Disconne

Windows 10 KB5055063 更新详解及安装故障排除 KB5055063 是针对 Windows 10 22H2 版本的 .NET Framework 更新,包含重要的改进和修复。本文将深入探讨 KB5055063,包括下载方法以及解决安装失败问题的多种途径。 Windows 10 KB5055063 简介 KB5055063 是针对 Windows 10 版本 22H2 的 .NET Framework 3.5、4.8 和 4.8.1 的累积更新,于 2025 年 3 月 25 日

Windows 11上的KB5054980安装问题故障排除 Microsoft于2025年3月25日发布了KB5054980,适用于Windows 11版本22H2和23H2。虽然此更新不包含新的安全功能,但它包含了所有先前发布的Securei
