第二十七篇:Windows驱动中的PCI, DMA, ISR, DPC, ScatterGater, MapRegsiter, CommonBuffer, ConfigSpace
近期有些人问我PCI设备驱动的问题, 和他们交流过后, 我建议他们先看一看<<The Windows NT Device Driver Book>>这本书, 个人感觉, 这本书写得很连贯流畅.
PCI设备驱动基本包含了PCI的资源获取, 配置空间的读写, 中断的处理, 中断后半部在DPC中的处理.
同一时候, 也必须了解DMA, ScatterGater, MapRegister, Common Buffer等基础.
1.1 PCI设备资源获取
PCI设备的资源是系统依据设备的属性(配置空间中寄存器的值)来动态分配的.
驱动中仅仅需在PNP START中获取这些系统分配的资源:
比如: 笔者开发的PCI电视卡驱动中, 就使用到了当中了两类资源, CmResourceTypePort与CmResourceTypeInterrupt.
Port地址作为设备寄存器首地址, 之后, 能够使用WRITE_PORT_ULONG与READ_PORT_ULONG加上对应的OFFSET来对设备寄存器进行訪问.
Interrupt资源中解释出来的内容, 则主要作为IoConnectInterrupt系统函数的參数, 将设备的硬件中断与ISR相关联, KINTERRUPT的实例则是设备中断的软件形式的载体.
1.2 DMA
DMA设备, 在系统中分为MASTER与SLAVE, 另外一个非常重要的能力就是是否支持Scatter/Gather.
这些能力终于表如今DEVICE_DESCRIPTION所定义的数据结构的成员中, 比如:DmaWidth, ScatterGather, Master, Dma32BitAddresses, Dma64BitAddresses.
系统终于将各种不同类型的设备DMA抽象为DMA_ADAPTER的实例, 它是设备DMA软件形式的载体.
驱动代码通过IoGetDmaAdapter系统调用, 将物理设备对象PDO与DMA描写叙述结构作为參数, 终于得到这个DMA_ADAPTER对象, 作为兴许一系列DMA相关操作的实体对象.
1.3 Map Register
用户空间, 内核空间的虚拟内存与物理内存的关联是通过页表来映射的, 驱动程序猿经常会使用MDL, 它也是某一特定区域虚拟内存与物理内存的映射关系.
而DMA设备则须要从总线地址(MSDN中又叫逻辑地址)与内存物理的映射关系角度去看待系统内存.
这个映射的关系就是由Map Register承担的.
只是, 这批Map Register则依据系统而定, 有些是硬件实现, 有些是软件中划分出来的特定的一块内存.
IoGetDmaAdapter的调用, 也是向系统申请Map Register的过程.
1.4 Common Buffer
这也是大家问得最多的问题
简单地讲, Common buffer是以DMA_ADAPTER为代表所申请的, 申请成功后, 既能通过虚拟地址訪问, 也能够通过DMA控制器所属逻辑地址空间的地址来訪问的连续物理内存.
它的优点就是物理上连续, 存在的问题是系统中连续物理内存是随着系统的执行时间的流逝, 越来越稀缺.
AllocateCommonBuffer系统调用是作为DMA_ADAPTER的DmaOperations形式存在的, 所以, 详细的一块Common Buffer能够说, 是与详细的一个DMA控制器所关联的.
AllocateCommonBuffer成功调用后, 会返回虚拟地址与DMA控制器所属逻辑空间的逻辑地址.
笔者开发的PCI电视卡, 就是通过AllocateCommonBuffer分配一块较小的连续物理内存, 用来存放Scatter/Gather列表 (某块内存的逻辑地址SCATTER_GATHER_LIST.Elements[i].Address.LowPart 与该内存的长度SCATTER_GATHER_LIST.Elements[i].Length, 对应操作通过common buffer的虚拟地址 ).
这个Scatter/Gather List列表终于由具有S/G能力的DMA控制器来读取(对应操作通过common buffer的逻辑地址), 依据当中的表项, 进行DMA读/写操作.
1.5 S/G
S/G的能力是DMA控制器的特性, 假设具有S/G的能力, 则能够批量地DMA操作, 否则, 必须一次一次地使用MapTransfer来完毕DMA操作.
系统空间的中虚拟内存与物理内存之间的联系通过IoAllocateMdl与MmBuildMdlForNonPagedPool建立特定的MDL来表示.
其后,通过DMA_ADAPTER的DmaOperations中的GetScatterGatherList获取MDL所描写叙述的虚拟地址内存的S/G列表, 最后, 在GetScatterGatherList的
PCI设备驱动全然能够用在PCIe设备上, 毕竟上层来讲, 他们没有太多的差别.
与USB驱动不同, PCI设备须要考虑驱动设计中的方方面面, 希望这篇文章对大家有所借鉴作用.
第二十七篇:Windows驱动中的PCI, DMA, ISR, DPC, ScatterGater, MapRegsiter, CommonBuffer, ConfigSpace的更多相关文章
- Egret入门学习日记 --- 第二十篇(书中 9.1~9.3 节 内容 组件篇)
第二十篇(书中 9.1~9.3 节 内容 组件篇) 第八章中的内容. 以上都是基本的Js知识,我就不录入了. 直接来看 第9章. 开始 9.1节. 以上内容告诉你,Egret官方舍弃了GUI,使用了E ...
- Egret入门学习日记 --- 第十七篇(书中 7.4~8.2节 内容)
第十七篇(书中 7.4~8.2节 内容) 昨天看到 7.3 节,那么今天. 开始 7.4节. 好吧,这些其他的服务器运行知识,就不搞了... 至此,7.4节 内容结束. 开始 7.5节 内容. ...
- linux设备驱动第五篇:驱动中的并发与竟态
综述 在上一篇介绍了linux驱动的调试方法,这一篇介绍一下在驱动编程中会遇到的并发和竟态以及如何处理并发和竞争. 首先什么是并发与竟态呢?并发(concurrency)指的是多个执行单元同时.并行被 ...
- Windows驱动中通过MDL实现用户态与核心态共享内存
Windows驱动跑在核心态(Kernel mode),驱动的调用者跑在用户态.如何使用户态进程与核心态驱动共享内存呢 ? 我们知道32位Windows中,默认状态下虚拟空间有4G,前2G是每个进程私 ...
- 第二十七篇 -- 如何给静态文本设置成ico图标形式以及如何修改文本框中的内容
修改静态文本框内容: CWnd* pWnd = GetDlgItem(IDC_STATIC1); pWnd->SetWindowText(_T("Server is on!" ...
- Android UI开发第二十七篇——实现左右划出菜单
年前就想写左右滑动菜单,苦于没有时间,一直拖到现在,这篇代码实现参考了网上流行的SlidingMenu,使用的FrameLayout布局,不是扩展的HorizontalScrollView. 程序中自 ...
- 第二十七篇 -- QTreeWidget总结
前言 之前写过几篇关于TreeWidget的文章,不过不方便查阅,特此重新整合作为总结.不过关于QtDesigner画图,还是不重新写了,看 第一篇 就OK. 准备工作 1. 用QtDesigner画 ...
- 第二十七篇:SOUI中控件属性查询方法
SOUI项目的SVN根目录下有一个doc目录,下面有一份控件属性表.包含了大部分控件的大部分属性,不过也不一定完全准确.最保险的办法还是查源代码. SOUI对象包含控件及ISkinObj等从SObje ...
- 第二十一篇:SOUI中的控件注册机制
Win32编程中,用户需要一个新控件时,需要向系统注册一个新的控件类型.注册以后,调用::CreateWindow时才能根据标识控件类型的字符串创建出一个新的控件窗口对象. 为了能够从XML描述的字符 ...
随机推荐
- 【东软实训】SQLselect及其相关操作
SQL select 及相关操作 SQL是用于访问和处理数据库的标准的计算机语言,我们所使用的的是Oracle SQL 一个数据库通常包含一个或多个表,每个表有一个名字表示,下图即为一个名为“emp” ...
- JavaSE-19 IO
学习要点 File类操作文件和目录的属性 字节流读写文件 字符流读写文件 字节流读写二进制文件 文件操作 1 文件的定义 文件可认为是相关记录或放在一起的数据的集合.文件一般保存在硬盘.U盘.光盘. ...
- Python tldextract模块
最新发布的 PyPI: pip install tldextract 或者最新的开发版本: pip install -e 'git://github.com/john-kurkowski/tldext ...
- bash基础——管道符、通配符
1.多命令顺序执行 多命令顺序执行 格式 作用 ; 命令1 ; 命令2 多个命令之间没有任何逻辑联系 && 命令1&&命令2 逻辑与 当命令1正确执行,则命令2才会执行 ...
- java混淆工具Jocky和Proguard
java混淆工具有很多种,这里介绍Jocky和Proguard 一:Jocky是金蝶中间件技术领袖袁红岗先生的个人作品(旧有名称JOC).原本是方便Apusic 应用服务器的开发,现在开放出来,供大家 ...
- h5 中MP3 播放暂停 jq
<!--音乐--> <div id="music"> <img src="../img/music.gif" class=&quo ...
- 【牛客小白月赛6】 J 洋灰三角 - 快速幂&逆元&数学
题目地址:https://www.nowcoder.com/acm/contest/136/J 解法一: 推数学公式求前n项和: 当k=1时,即为等差数列,Sn = n+pn(n−1)/2 当k≠1时 ...
- 【thinking in java】ArrayList源码分析
简介 ArrayList底层是数组实现的,可以自增扩容的数组,此外它是非线程安全的,一般多用于单线程环境下(Vector是线程安全的,所以ArrayList 性能相对Vector 会好些) Array ...
- CSRF之Ajax请求
A:Ajax提交数据是,携带的CSRF在data中: <form method="POST" action="/csrf.html"> {% csr ...
- MySQL数据库初识
认识数据库 1 什么是数据(Data) 描述事物的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字.图片,图像.声音.语言等,数据由多种表现形式,它们都可以经过数字化后存入计算机 在计算机中 ...