当前位置: 首页 > news >正文

windows驱动开发-DMA技术(一)

DMA(Direct Memory Access)是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依于 CPU 的大量中断负载,否则CPU 需要从设备缓存中把每一页的数据复制到缓存中,然后把它们再次写入到新的地方,在这个过程中中,CPU 需要一直控制这个过程。 DMA 则是由DMA控制器直接将数据从一个地址空间复制到另外一个地址空间。

由于现在电脑基本上统一了内部总线,所以所有的DMA都是PCI总线来进行的,故了解了PCI总线是如何处理DMA的,那也就了解了DMA是如何进行的。

如果调试过PCI总线,那么会发现,DMA是以一个内存页面为单位进行的,每次DMA传输的总是内存页面的整数倍,PCI会先将windows的内存地址写入到DMA控制器,然后向寄存器写入数据来启动DMA传输,但是,这一切操作已经被windows封装起来了,在windows中,我们会直接分配适配器对象,使用适配器来操作DMA。

适配器对象

任何使用直接 I/O 和 DMA 的驱动程序都必须创建适配器对象。 适配器对象表示 DMA 控制器通道或端口,或总线-主设备。

两种最低级别驱动程序必须使用适配器对象:

  • 使用系统 DMA 控制器的设备驱动程序。 此类设备称为 从属设备 ,称为“使用系统 (或 从属) DMA”。
  • 用作总线-主适配器的设备驱动程序。 此类设备与系统仲裁以使用 I/O 总线,因此使用总线主 DMA。

驱动程序通常位于设备扩展中,为指向适配器对象的指针提供存储。

为了执行 DMA 传输,使用这些 DMA 方法的设备驱动程序通常具有AdapterControl 例程,并调用系统提供的用于操作适配器对象的支持例程。 不需要 AdapterControl 例程的 (驱动程序包括 那些使用Scatter/Gather DMA 的驱动程序,以及那些使用 common-buffer、bus-master DMA.)就是使用总线主DMA的驱动。

作为设备启动操作的一部分,处理 DMA 操作的驱动程序调用 I/O 管理器,后者又调用特定于平台的 HAL 来创建一组适配器对象。 在任何 Windows 平台上,适配器对象集通常包括以下对象的适配器对象:

  • 从属设备连接到的每个系统 DMA 控制器通道或端口。
  • 计算机中的每个总线主 DMA 设备。
获取/释放适配器

在设备启动时,使用系统或总线主 DMA 的驱动程序会调用 IoGetDmaAdapter 来获取指向适配器对象的指针,并确定每个传输操作可用的映射寄存器的最大数目。 当驱动程序调用 IoGetDmaAdapter 时,I/O 管理器反过来会调用 HAL 以获取特定于平台的必要信息。

驱动程序必须在调用 IoGetDmaAdapter 时,在系统定义的DEVICE_DESCRIPTION结构中提供某些信息。 驱动程序必须使用 RtlZeroMemory 初始化 DEVICE_DESCRIPTION 结构,并在其中设置值。

所需数据包括有关驱动程序设备功能的信息,例如设备是否为总线主机、设备是否具有散点/收集功能,以及设备一次可以传输多少字节的数据, (MaximumLength) 。

所需的设备说明数据还包括特定于平台的信息,例如总线主设备驱动程序控制的特定于平台和系统分配的总线编号。 驱动程序可以通过调用 IoGetDeviceProperty 来获取此信息。

DEVICE_DESCRIPTION结构包括一些可能与某些 DMA 设备或驱动程序无关的字段。 例如,WDM 驱动程序中不使用 BusNumber 字段。 每个驱动程序应为相关结构成员提供值,并应将所有其他成员的值设置为零。

当请求必须分解为两个或更多个 DMA 操作时,除非设备能够等待系统 DMA 控制器重新编程,否则从属设备的驱动程序不应在 ScatterGather 字段中传递 TRUE。

IoGetDmaAdapter 返回指向适配器对象的指针和特定于平台或特定于设备的值,该值指示适配器对象可用于每个 DMA 传输操作的映射寄存器数。

返回的适配器对象包含三个可供驱动程序访问的字段:

  • 版本号 (版本)
  • 大小 (大小)
  • 指向 DmaOperations(DMA_OPERATIONS) 结构的指针

DMA_OPERATIONS 结构包含指向驱动程序在其设备上执行 DMA 操作时必须使用的函数的指针表, 函数只能通过此数据结构中的指针访问,驱动程序无法直接按名称调用它们。 (请注意,这些例程替换以前版本的 Windows NT 中支持的 HalXxx 例程。为了确保旧驱动程序的兼容性,Wdm.h 和 Ntddk.h 头文件提供具有过时名称的宏,但新驱动程序应始终通过 data structure.)

映射寄存器的数量可能因设备以及平台而异。 通常,HAL 根据以下条件分配多个映射寄存器:

如果可能,HAL 将返回一个值,该值比传输 MaximumLength 字节所需的映射寄存器数多一个,如驱动程序对 IoGetDmaAdapter 的调用中所述。

否则,HAL 将返回一个较小的值,该值对于特定平台来说尽可能大。

换句话说,HAL 通常为每个驱动程序提供足够的映射寄存器,以最大化其设备的 DMA 吞吐量,但 HAL 在某些 Windows 平台上可以返回较小的值。 无法保证驱动程序将获取它请求的映射寄存器数,因此驱动程序应始终检查返回的值。

任何 DMA 设备驱动程序都必须为 IoGetDmaAdapter 返回的适配器对象指针和 NumberOfMapRegisters 值提供存储。 此指针是指向系统提供的用于 DMA 的支持例程的必需参数。 由于其中许多支持例程必须在 IRQL = DISPATCH_LEVEL调用,因此驱动程序分配的存储必须是驻留的。 大多数 DMA 驱动程序在 设备扩展中提供必要的存储。 但是,如果驱动程序也使用控制器对象或驱动程序分配的非分页池,则存储可以位于 控制器 扩展中。

驱动程序完成所有 DMA 操作后,会调用 PutDmaAdapter 以释放适配器对象。

AdaptControl例程要求

AdapterControl 例程必须至少执行以下操作:

1. 保存输入 MapRegisterBase 值以及驱动程序为当前 IRP 执行一个或多个 DMA 传输操作所需的任何其他上下文信息。 每个 DMA 传输操作完成后,驱动程序必须将 MapRegisterBase 值传递给 FlushAdapterBuffers 。

2. 返回相应的 IO_ALLOCATION_ACTION 值:

  • 如果设备是从属设备,则为 KeepObject,因此驱动程序使用系统 DMA。
  • 如果设备是总线主机,则 DeallocateObjectKeepRegisters,因此驱动程序使用基于数据包的总线主 DMA。

根据驱动程序的设计,其 AdapterControl 例程也可以在返回控制权之前执行以下操作:

  • 1. 确定传输在其设备上的起始位置;
  • 2. 根据由于传输的开始位置而对其设备的任何限制,计算可能的传输大小;一般情况下,调用 AllocateAdapterChannel 的例程负责确定是否必须将转移请求拆分为部分传输,因为针对每个 DMA 传输操作可用的 NumberOfMapRegisters 存在任何特定于平台的限制;
  • 3. 设置有关设备 (或控制器) 扩展中的每个传输请求的任何驱动程序维护的状态;例如,AdapterControl 例程可能会使用 CustomTimerDpc 例程的入口点调用 KeSetTimer,该例程超时驱动程序的 DMA 传输操作;
  • 4. 使用在 Irp-> MdlAddress传递的 MDL 指针调用 MmGetMdlVirtualAddress,以获取传输开始的索引,适合传递给 MapTransfer;
  • 5. 调用 MapTransfer 以设置系统 DMA 控制器或获取总线-主设备的物理到逻辑地址映射。
  • 6. 使用通过调用 KeSynchronizeExecution 调用的 SynchCritSection 例程对驱动程序的设备进行编程,以便执行传输操作。 

如果传输请求要求驱动程序执行一系列部分传输操作以满足当前 IRP,则驱动程序的 DpcForIsr 或 CustomDpc 例程通常负责对设备进行重新编程,以便执行后续传输操作。 每个传入传输 IRP 仅调用 一次 AdapterControl 例程。

完成当前传输 IRP 的驱动程序例程(通常是 DpcForIsr 或 CustomDpc 例程)也负责通过分别调用 FreeAdapterChannel 或 FreeMapRegisters 来释放系统 DMA 控制器或总线-主适配器。 此驱动程序例程应在完成其最后一次部分传输操作时尽快发出相应的调用,以便从属 DMA 设备的驱动程序可以分配系统 DMA 控制器,或者总线-主驱动程序可以立即开始处理下一个传输 IRP。

IRP_MN_START_DEVICE 请求的驱动程序调度例程必须为 AdapterControl 例程执行以下操作:

  • 通过填写 DEVICE_DESCRIPTION结构并 调用 IoGetDmaAdapter,为设备的 DMA 功能设置适配器对象。
  • 保存 IoGetDmaAdapter 返回的适配器对象指针和 NumberOfMapRegisters。
  • IoGetDmaAdapter 返回的平台特定最大 NumberOfMapRegisters 或驱动程序设备的传输功能(以限制性更强者为准)确定驱动程序是否必须拆分给定的传输请求并在其设备上执行多个 DMA 操作来满足该 IRP。

返回的适配器对象指针、驱动程序的 AdapterControl 例程的入口点、表示当前 IRP 的目标设备的 DeviceObject 指针、指向已为 AdapterControl 例程设置的区域的上下文指针,以及 NumberOfMapRegisters 值(可能小于较小传输请求的最大可能数目)必须在调用中传递给 AllocateAdapterChannel。 通常,驱动程序的 StartIo (或可能是 ControllerControl) 例程在调用 AllocateAdapterChannel 之前在 Context 处设置区域。

在系统中,可能以两种不同的方式使用DMA,基于数据包的系统DMA、基于公用缓冲区的系统DMA。

相关文章:

windows驱动开发-DMA技术(一)

DMA(Direct Memory Access)是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依于 CPU 的大量中断负载,否则CPU 需要从设备缓存中把每一页的数据复制到缓存中,然后把它们再次写入到新的地方,在这个过…...

实用的Chrome命令

以下是一些实用的Chrome命令及其用途: --allow-outdated-plugins:允许浏览器使用过期的插件,这在开发过程中可能会用到,以便测试兼容性。chrome://downloads:打开Chrome的下载页面,查看和管理你的下载文件…...

数据库(MySQL)基础:约束

一、概述 1.概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。 2.目的:保证数据库中数据的正确、有效性和完整性。 3.分类 约束描述关键字非空约束限制该字段的数据不能为nullnot null唯一约束保证该字段的所有数据都是唯一…...

ControlNet作者放大招!IC-Light:控制生成图片光照效果!

ControlNet作者张吕敏近日又开源了一项新的工作:IC-Light (Impose Constant Light),在不改变图片内容的条件下,可以控制生成图片的光照效果。 作者发布了两种类型的模型:文本条件重打光模型和背景条件重打光…...

【Java】Java中类的初始化顺序(静态方法,静态块,非静态块,最后有流程图)

📝个人主页:哈__ 期待您的关注 目录 一、无继承关系类的初始化 1、静态变量k被初始化 2、静态变量t1初始化 3、静态变量 t2初始化 4、静态变量i初始化 5、静态变量n初始化 6、静态块初始化 7、非静态块初始化 8、非静态属性初始化 9、执行构造…...

在RK3588开发板使用FFMpeg 结合云服务器加SRS实现摄像头数据推流到云端拱其他设备查看

今天测试了一把在开发板把摄像头数据推流到云端服务器,然后给其他电脑通过val软件拉取显示摄像头画面,浅浅记录一下大概步骤 1.开发板端先下载ffmpeg apt install ffmpeg2.云服务器先安装SRS的库 云服务器我使用ubuntu系统,SRS是个什么东西&…...

elasticsearch搭建教程

主要参看这里就行,需要特别注意其中报错的解决方案:搭建elasticsearch 单机节点里,按照上述教程搭建只能开放本地访问,如果需要其他机器访问,需要在elasticsearch.yml里新增几个配置: node.name: node-1 network.host…...

c++ 归并排序

归并排序是一种遵循分而治之方法的排序算法。它的工作原理是递归地将输入数组划分为较小的子数组并对这些子数组进行排序,然后将它们合并在一起以获得排序后的数组。 简单来说,归并排序的过程就是将数组分成两半,对每一半进行排序&#xff0c…...

基于vs和C#的WPF应用之动画3

注&#xff1a;1、在内部和外部使用缓动函数 <Grid.Resources> <PowerEase x:Key"powerease" Power"3" EasingMode"EaseInOut"/> </Grid.Resources> <DoubleAnimation EasingFunction"{StaticResource powerease}&quo…...

Python import 必看技巧:打造干净利落的代码结构

大家好,学习Python你肯定绕不过一个概念import,它是连接不同模块的桥梁,是实现代码复用和模块化的关键。本文将带你深入探索Python中import的原理,并分享一些实用的导入技巧。 1. import 原理 导入机制概述 在Python中,模块(module)是一种封装Python代码的方式,它允许…...

计算机视觉(CV)(Computer Vision)

计算机视觉技术&#xff08;Computer Vision&#xff09;&#xff0c;解决的是什么&#xff1f; 图片和视频是非结构化数据&#xff0c;机器如果要理解某一图片或视频表达的内容&#xff0c;是无法直接分析的&#xff0c;这种情况&#xff0c;就需要有计算机视觉技术&#xff…...

python:画折线图

import pandas as pd import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties# 设置新宋体字体的路径 font_path D:/reportlab/simsun/simsun.ttf# 加载新宋体字体 prop FontProperties(fnamefont_path)""" # 读取 xlsx 文件 d…...

Spring Data JPA 与 MyBatisPlus的比较

前言 JPA&#xff08;Java Persistence API&#xff09;和MyBatis Plus是两种不同的持久化框架&#xff0c;它们具有不同的特点和适用场景。 JPA是Java官方的持久化规范&#xff0c;它提供了一种基于对象的编程模型&#xff0c;可以通过注解或XML配置来实现对象与数据库的映射…...

【C++】STL-list的使用

目录 1、list的使用 1.1 list的构造 1.2 list的遍历 1.3 list capacity 1.4 list element access 1.5 容量相关 list是一个带头双向循环链表 1、list的使用 1.1 list的构造 1.2 list的遍历 list只有两种遍历方式&#xff0c;因为没有operator[] 因为list的双向链表&am…...

进度条(小程序)

缓冲区的概念 缓冲区是内存中的一个临时存储区域&#xff0c;用来存放输入或输出数据。在标准 I/O 库中&#xff0c;缓冲区的使用可以提高数据处理的效率。例如&#xff0c;当向终端输出文本时&#xff0c;字符通常存储在缓冲区中&#xff0c;直到缓冲区满或者遇到特定条件时才…...

PyCharm安装教程(超详细图文教程)

一、下载和安装 1.进入PyCharm官方下载&#xff0c;官网下载地址&#xff1a; https://www.jetbrains.com/pycharm/download/ 专业版安装插件放网盘了&#xff0c;网盘下载即可&#xff1a;itcxy.xyz/229.html2.安装 1.下载后找到PyCharm安装包&#xff0c;然后双击双击.ex…...

金蝶BI应收分析报表:关于应收,这样分析

这是一张出自奥威-金蝶BI方案的BI应收分析报表&#xff0c;是一张综合运用了筛选、内存计算等智能分析功能以及数据可视化图表打造而成的BI数据可视化分析报表&#xff0c;可以让企业运用决策层快速知道应收账款有多少&#xff1f;账龄如何&#xff1f;周转情况如何&#xff1f…...

salmon使用体验

文章目录 salmon转录本定量brief模式一&#xff1a;fastq作为输入文件需要特别注意得地方 模式二&#xff1a; bam文件作为输入 salmon转录本定量 brief 第一点是&#xff0c;通常说的转录组分析其中有一项是转录本定量&#xff0c;这是一个很trick的说话&#xff0c;说成定量…...

Ubuntu 20.04 安装 Ansible

使用官方的 Ubuntu PPA 更新包列表&#xff1a; apt update安装软件属性常用命令 apt install software-properties-common添加 Ansible PPA 到系统&#xff1a; add-apt-repository --yes --update ppa:ansible/ansible再次更新包列表以包括新添加的 PPA&#xff1a; apt …...

TypeScript学习笔记:强类型JavaScript的优雅之旅

在前端开发领域&#xff0c;JavaScript以其灵活性和广泛的支持度成为无可争议的王者。然而&#xff0c;随着项目规模的增长&#xff0c;JavaScript的动态类型特性开始暴露出一些问题&#xff0c;比如代码的可维护性、类型错误难以提前发现等。为了解决这些问题&#xff0c;Micr…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...