在做Windows系统PCIe驱动时,遇到的一些硬件驱动有关的问题总结一下:

一、K7

K7处理器:信号采集卡

K7系列CPU是AMD公司推出的高性价比CPU。

结构

3个并行的X86指令解码器;9个为高频率优化的超标量微结构;动态推测时序,乱序执行; 2048个入口分支预测表和12个入口返回堆栈;3个超标量乱序整数管道,每个包含: 整数执行单元,地址产生单元;3个超标量乱序多媒体管道;64K指令一级CACHE和64K数据一级cache,每两路相关;2个通用64位数据cache装载/存储端口;高速64位后方2级CACHE控制器:支持512K到8MB二级cache,可编程接口速度;高速64位系统接口:200MHz系统总线。

AMD的K7处理器并没有采用和Intel的GTL+相同的系统总线协议,它使用的是Digital公司的Alpha系统总线协议EV6。顺便说一下,Alpha处理器是一种用于服务器系统的纯64位处理器,其性能优于现在用于PC系统的处理器。K7使用的EV6系统总线有许多的优点,首先,它有许多比GTL+更为优秀的构造,例如它使用点对点布局。其次它可以支持200MHz的外频,我们见到的K7是工作在200MHz的外频下的,K7 CPU成为第一个从高带宽内存如Direct RDRAM和DDR SDRAM中受益的CPU。

AMD在1999年底推出内建L2 Cache的“Sharptooth利齿”(K6-3)处理器,,K7内置的tag RAM足以支持和Intel的PentiumⅡ处理器一样的512KB的L2 Cache,同时AMD还考虑生产像Intel的P6 CPU一样的外置的tag RAM,来支持不少于2MB—8MB的具有64位可编程控制的后置L2 Cache。虽然K7将不会把L2 Cache内建在处理器里,但是L2 Cache的速度将占CPU主频的1/3至全速,并且L2 Cache将使用SRAM或者DDR SRAM以保证其速度。K7拥有128KB的L1 Cache,其中,64KB将作为数据缓存,剩下的64KB将作为指令缓存。

缓存

拥有大量的L1 Cache对高速的处理器来说是必须的,没有足够的缓存是导致处理器性能提高的一大瓶颈。通过L2 Cache的大小和速度来决定CPU的用途,工作站或是服务器。使用加大缓存容量和DDR SDRAM作为L2 Cache的K7能够提供非常优秀的性能。

K7有三条并行的x86指令译码器,用于将X86指令翻译成定长的微指令,每条微指令可以执行1到2个操作。K7有两种不同的译码流水线做这个工作,直接路径译码器快速地译码通用指令,而辅助路径译码器在微代码ROM中检索复杂的X86指令。K7有72个指令控制单元指令,控制单元分配微指令到乱序整数管道和乱序多媒体管道中去。乱序整数管道可以支持15个微指令,最大可同时进行30个操作,它的工作是分配3个独立的操作到3个并行的整数执行单元中去,每个执行单元都带有一个地址发生单元。地址发生单元能够通过优化L1和L2缓存数据的存取来保证最快的操作速度。

二、DMA

DMA:直接存储器访问。

DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用

(1)原理

DMA 传输将数据从一个地址空间复制到另外一个地址空间。当CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。DMA 传输对于高效能 嵌入式系统算法和网络是很重要的。

在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束4个步骤。

(2)传输方式

DMA技术的出现,使得外围设备可以通过DMA控制器直接访问内存,与此同时,CPU可以继续执行程序。那么DMA控制器与CPU怎样分时使用内存呢?通常采用以下三种方法:(1)停止CPU访内存;(2)周期挪用;(3)DMA与CPU交替访问内存。

停止CPU访问内存

当外围设备要求传送一批数据时,由DMA控制器发一个停止信号给CPU,要求CPU放弃对地址总线、数据总线和有关控制总线的使用权。DMA控制器获得总线控制权以后,开始进行数据传送。在一批数据传送完毕后,DMA控制器通知CPU可以使用内存,并把总线控制权交还给CPU。图(a)是这种传送方式的时间图。很显然,在这种DMA传送过程中,CPU基本处于不工作状态或者说保持状态。

优点: 控制简单,它适用于数据传输率很高的设备进行成组传送。

缺点: 在DMA控制器访内阶段,内存的效能没有充分发挥,相当一部分内存工作周期是空闲的。这是因为,外围设备传送两个数据之间的间隔一般总是大于内存存储周期,即使高速I/O设备也是如此。例如,软盘读出一个8位二进制数大约需要32us,而半导体内存的存储周期小于0.5us,因此许多空闲的存储周期不能被CPU利用。

周期挪用

当I/O设备没有DMA请求时,CPU按程序要求访问内存;一旦I/O设备有DMA请求,则由I/O设备挪用一个或几个内存周期。

这种传送方式的时间图如下图(b):

I/O设备要求DMA传送时可能遇到两种情况:

(1)此时CPU不需要访内,如CPU正在执行乘法指令。由于乘法指令执行时间较长,此时I/O访内与CPU访内没有冲突,即I/O设备挪用一二个内存周期对CPU执行程序没有任何影响。

(2)I/O设备要求访内时CPU也要求访内,这就产生了访内冲突,在这种情况下I/O设备访内优先,因为I/O访内有时间要求,前一个I/O数据必须在下一个访问请求到来之前存取完毕。显然,在这种情况下I/O 设备挪用一二个内存周期,意味着CPU延缓了对指令的执行,或者更明确地说,在CPU执行访内指令的过程中插入DMA请求,挪用了一二个内存周期。 与停止CPU访内的DMA方法比较,周期挪用的方法既实现了I/O传送,又较好地发挥了内存和CPU的效率,是一种广泛采用的方法。但是I/O设备每一次周期挪用都有申请总线控制权、建立线控制权和归还总线控制权的过程,所以传送一个字对内存来说要占用一个周期,但对DMA控制器来说一般要2—5个内存周期(视逻辑线路的延迟而定)。因此,周期挪用的方法适用于I/O设备读写周期大于内存存储周期的情况。

DMA与CPU交替访问内存

如果CPU的工作周期比内存存取周期长很多,此时采用交替访内的方法可以使DMA传送和CPU同时发挥最高的效率。

这种传送方式的时间图如下:

此图是DMA与CPU交替访内的详细时间图.假设CPU工作周期为1.2us,内存存取周期小于0.6us,那么一个CPU周期可分为C1和C2两个分周期,其中C1专供DMA控制器访内,C2专供CPU访内。

这种方式不需要总线使用权的申请、建立和归还过程,总线使用权是通过C1和C2分时制的。CPU和DMA控制器各自有自己的访内地址寄存器、数据寄存器和读/写信号等控制寄存器。在C1周期中,如果DMA控制器有访内请求,可将地址、数据等信号送到总线上。在C2周期中,如CPU有访内请求,同样传送地址、数据等信号。事实上,对于总线,这是用C1,C2控制的一个多路转换器,这种总线控制权的转移几乎不需要什么时间,所以对DMA传送来讲效率是很高的。

这种传送方式又称为“透明的DMA”方式,其来由是这种DMA传送对CPU来说,如同透明的玻璃一般,没有任何感觉或影响。在透明的DMA方式下工作,CPU既不停止主程序的运行,也不进入等待状态,是一种高效率的工作方式。当然,相应的硬件逻辑也就更加复杂。

三、PCIe

PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准。

由于后者的固有限制,包括半双工操作,超量信号计数以及由于定时偏移引起的固有的较低带宽,因此,传统的并行总线选择了绑定串行总线架构。定时偏移来自在不同长度的导线,潜在不同的印刷电路板(PCB)层和可能不同的信号速度下行进的并行接口内的分离的电信号。尽管作为单个字同时传输,并行接口上的信号具有不同的行进持续时间,并在不同时间到达其目的地。当接口时钟周期短于信号到达之间的最大时间差时,就不可能恢复传输的字。由于并行总线上的定时偏移量可能达到几纳秒,因此所产生的带宽限制在几百兆赫的范围内。

串行接口不会出现定时偏移,因为每个通道中每个方向只有一个差分信号,并且由于时钟信息嵌入在串行信号本身中,所以没有外部时钟信号。因此,串行信号的典型带宽限制在几千兆赫范围内。 PCI Express是串行互连替代并行总线的一般趋势的一个例子;其他示例包括Serial ATA(SATA),USB,Serial Attached SCSI(SAS),FireWire(IEEE 1394)和RapidIO。在数字视频中,常用的例子有DVI,HDMI和DisplayPort。

多通道串行设计增加了灵活性,其能够为较慢的设备分配较少的通道。

驱动——K7-DMA-PCIe相关推荐

  1. STM32F103系列_OLED屏幕(SSD1306、SSD1315驱动)SPI驱动【DMA】(高刷)

    STM32F103系列_OLED屏幕(SSD1306.SSD1315驱动)SPI驱动[DMA](高刷) 一.SSD1306和SSD1315 二.电路原理图(SPI接法) 三.STM32_SPI 四.S ...

  2. 嵌入式Linux设备驱动程序开发指南14(Linux设备驱动使用DMA)——读书笔记

    Linux设备驱动使用DMA 十四.Linux设备驱动使用DMA 14.1 简介 14.2 缓存一致性 14.3 DMA控制器接口 14.4 流式DMA模块 14.4.1 sdma_sam_m2m.c ...

  3. linux io使用dma传输,linux驱动之DMA

    一.前言 在 嵌入式Linux 的内核及驱动中,DMA 常常被人提起.我们也许清楚它的原理且很明白它非常重要,但在某种程度上,对于 DMA 的使用者来说,我们一般使用其接口,而很少去了解整个 DMA ...

  4. *****Linux下PCIe驱动以及DMA机制

    1. 驱动程序作用: ·        设备驱动程序向应用程序屏蔽了硬件在实现上的细节,使得应用程序可以像操作普通文件一样操作外部设备.Linux操作系统抽象了对硬件的处理,可以使用和操作文件相同的, ...

  5. Linux设备驱动:DMA 接口API

    目录 DMA概述 DMA与cache的一致性 相关API DMA数据结构 DMA概述 DMA是一种无需CPU的参加就可以让外设与系统内存之间进行双向数据传输的硬件机制. 它可以使系统CPU从实际的I/ ...

  6. Linux驱动之DMA

    上代码之前说一点自己的总结:不能用kmalloc,因为 kmalloc分配的物理地址有可能是不连续的,dma不能识别   DMA负责读取数据,读取的过程和CPU无关,当读取完了产生一次中断,让CPU来 ...

  7. Linux驱动开发之PCIe Host驱动

    作者 QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118 参考 PCI Utilitie ...

  8. Linux设备驱动开发--- DMA

    文章目录 1 设置DMA映射 缓存一致性和DMA DMA映射 一致映射 流式DMA映射 2 完成的概念 3 DMA引擎API 分配DMA从通道 设置从设备和控制器指定参数 获取事务描述符 提交事务 发 ...

  9. i40e网卡驱动中的PCI-E带宽警告

    使用的处理器为Xeon5122,4个核心,每个核心2个超线程.如下: / # cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu ...

  10. WS2812驱动 SPI+DMA 无需降频 一个灯占用9Byte的RAM

    WS2812驱动 STM32F103 SPI+DMA 无需降频 一个灯占用9Byte的RAM 对于WS2812不了解的朋友可以先看一下这些 ​[STM32]WS2812介绍.使用SPI+DMA发送数据 ...

最新文章

  1. Yann Lecun纽约大学《深度学习》2020课程笔记中文版,干货满满!
  2. Linux的僵尸进程及其解决方法(转)
  3. 前端性能优化之DOM(三)
  4. 递归调用层数太多_VBA学习笔记46:组合之递归算法(没写后补)
  5. mysql8.0安装问题
  6. 使用TensorFlow.js进行人脸触摸检测第1部分:将实时网络摄像头数据与深度学习配合使用
  7. springboot之@Async实现异步
  8. Wireshark实战分析之DHCP协议(一)
  9. Android 蓝牙驱动专题分析(2)--- 蓝牙驱动代码流程、kernel dump、tombstone问题分析
  10. 佛山成功办理全省首笔区块链出口退税业务
  11. (每日一练python)有效的数独
  12. CYQ.Data、ASP.NET Aries 百家企业使用名单
  13. 【加拿大签证】加拿大政府指定的签证办理中国体检医院一览【2019官方最新版,加拿大签证体检必看】
  14. 客户体验和营销:您需要了解的 5 个最佳实践
  15. 有什么小号音准测试软件,小号演奏家对小号初学者的一些建议 | 悦趣音乐中心...
  16. Tiled的qbs方式编译记录
  17. 世界杯电视直播表(及时更新)
  18. c语言编写数据存储的游戏,c语言经典小程序和c语言编写的小游戏带注释(自动保存的).doc...
  19. 洛谷 P2708 硬币翻转
  20. 用Java写一个集合竞价抓涨停的策略

热门文章

  1. 【数据结构笔记26】根据一棵树的先序/中序遍历Push与Pop内容,输出这棵树的先序、中序、后序遍历数组(不需要真的建立出树)
  2. 详解linux运维工程师入门级必备技能
  3. xenomai linux测试,Xenomai 实时线程 select 测试
  4. 2019 Web 前端热点笔试面试题总结(转载)
  5. kittito_rosbag入坑教程
  6. linux中线程的问题,linux中的线程问题
  7. 0bug到底碰痛了谁的神经?
  8. linux进入vi编辑报错,Linux Vi编辑器的使用及C编程
  9. java类型转换 float类型转换_Java类型转换 – float(和long)到int
  10. java调用arcgis soe发布的rest服务,中文传值乱码问题