zoukankan      html  css  js  c++  java
  • 总线主控DMA

    DMA都是主控总线的,这里的总线主控DMA是指设备本身具备DMA功能,而无需使用系统DMA控制器。

    总线主控DMA的设备,有两种基本的DMA方式

    • 基于包的DMA传输
    • 使用公共缓冲区的传输

    基于包的DMA传输一般是这样的过程:

    1. IRP到达Dispacher
    2. Dispacher分配一个通道AllocateAdapterChannel,这个例程会在一个合适的时候调用它的一个回调函数
    3. 回调函数内部会根据IRP的MDL得到内核虚拟地址,接着MapTransfer,调用会得到物理地址,这个物理地址是指总线相关的物理地址
    4. 得到物理地址后,一般是写入硬件寄存器,并且通知启动DMA传输
    5. 真正的DMA传输就开始了

    这种方式的DMA是可以直接把硬件的数据DMA到应用层的,效率相当高。另外DDK文档说明了一些Cache的控制,以及映射寄存器(x86是软件模拟的)的一些关系。需要仔细推敲和理解

    使用公共缓冲区的传输是比较简单的:

    1. 在StartDevice时,AllocateCommonBuffer得到一个公共缓冲区,这个缓冲区是物理连续的,有时候是会失败的。如果失败,那么StartDevice应该返回STATUS_INSUFFICIENT_RESOURCES.
    2. 和基于包的一样,IRP到达Dispacher,Dispacher直接使用缓冲区域地址编程硬件就可以启动DMA了
    3. 这个公共缓冲区需要在RemoveDevice时应该释放,FreeCommonBuffer是用来释放它的。

    这种方式的DMA的代码是对少的,但他有一个缺点,数据只能到驱动,不能直接到达应用层,但可以通过拷贝到达应用层。无疑这是有效率问题的。

    关于这两种方式的选择,DDK是这样建议的

    如果驱动可以知道设备传输数据的开始和结束,使用包方式。否则,使用公共缓冲区。为什么呢?

    DMA传输时,几乎完全是硬件行为,由于包方式的DMA,其地址是不连续的,那么DMA必定分多个阶段,每个阶段必须重新编程硬件。每个阶段都要中断主机,中断内如果无法判断全部传输结束,最终就会无法在合适的时候完成IRP。而公共缓冲区的方式,地址是连续的,设备可以在结束时才中断主机。

    另外,这两种方式并不互斥,可以即有包方式,又有公共缓冲区。比如,公共缓冲区放一些多次传输的信息,以表示传输的结束,多次DMA后,ISR可以根据这些信息判断结束,最终完成IRP

    除了基本的DMA方式,如果设备具备在不连续的物理地址上传输(Scatter/Gather特性),可以使用Scatter/Gather传输。关于Scatter/Gather方式和基于包的方式不做讨论了

  • 相关阅读:
    springmvc结合freemarker,非自定义标签
    springmvc的ModelAndView的简单使用
    tomcat无法正常启动的一个原因
    通过springmvc的RequestMapping的headers属性的使用
    springmvc入门demo
    Redis的入门Demo(java)
    Ubuntu18.0.4查看显示器型号
    APS审核经验+审核资料汇总——计算机科学与技术专业上海德语审核
    Java连接GBase并封装增删改查
    SpringMVC源码阅读:异常解析器
  • 原文地址:https://www.cnblogs.com/iwasmu/p/1556364.html
Copyright © 2011-2022 走看看