分享到:
计算机应用 最近更新
讨论未来电商发展趋势论文提纲
浅谈自媒体对现代生活的影响
论文范文:网络发展对青少年心理发展的影响
论我国电子商务应用中的支付问题
电子商务模式研究
中小型企业客户关系管理系统的开发与应用
中石油浙江销售分公司信息管理系统设计
图书馆管理系统分析与设计
物流师职业资格认证报名管理系统
销售管理系统的开发与设计
酒店客房管理系统
财务管理系统的实现
餐饮管理系统设计与实现
社区卫生服务管理系统
汽车营销企业的客户关系管理系统
明道管理咨询有限公司客户关系管理系统设计与开发
企业订单管理系统开发
基于WEB的CRM信息系统的开发与研究
高校科研工作量统计系统的开发与设计
基于Struts的连锁店管理系统
Linux下的PCI-Express设备驱动程序的研究与实现
摘  要  本文研究了Linux下的PCI-Express高速数据采集卡的驱动程序,在内核空间申请了足够大的DMA循环缓冲区,从而满足了系统对高速数据实时采集处理的要求。分别实现了查询模式和中断模式下的驱动程序,并通过实验结果的分析表明了中断模式在其性能上的优异性,提出了PCI-Express设备驱动程序进一步优化的方向。
    关键词  Linux;PCI-Express;DMA;设备驱动;中断
 

1 引言
    PCI-Express已经成长为新一代的I/O总线技术的主流,已经在服务器、存储系统、通信系统、数据处理、传输系统等领域中得到广泛的应用。基于PCI-Express总线的高速数据采集卡是信息处理系统中一个非常重要的设备,而驱动程序是硬件和操作系统之间的桥梁,对硬件设备的性能有着很大的影响,高效的驱动程序是实现高速数据实时采集、处理的一个重要保证。因此本文针对PCI-Express高速数据采集卡在Linux系统下的驱动程序进行了研究,并就如何设计和实现Linux下的驱动程序进行了深入的探讨。
2 Linux设备驱动程序 2.1 驱动程序的功能
    驱动程序的作用是应用程序与硬件之间的一个中间软件层,硬件通过驱动程序向应用程序展现其具有的功能。Linux将所有外部设备看成是一类特殊文件[1],称之为“设备文件”,如果说系统调用是Linux内核和应用程序之间的接口,那么设备驱动程序则可以看成是Linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件在实现上的细节,使得应用程序可以像操作普通文件一样来操作外部设备。Linux操作系统抽象了对硬件的处理,所有的硬件设备都可以像普通文件一样来看待:它们可以使用和操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和I/O控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。
    Linux系统中的所有硬件设备都使用一个特殊的设备文件来表示,例如,系统中的第一个IDE硬盘使用/dev/hda表示。每个设备文件对应有两个设备号:一个是主设备号,标识该设备的种类,也标识了该设备所使用的驱动程序;另一个是次设备号,标识使用同一设备驱动程序的不同硬件设备。设备文件的主设备号必须与设备驱动程序在登录该设备时申请的主设备号一致,否则用户进程将无法访问到设备驱动程序。
2.2 设备和模块的分类
    Linux系统将设备分成字符设备(Char Device)、块设备(Block Device)、网络设备(Network Device)三种基本类型。字符设备是个能够像字节流(类似文件)一样被访问的设备,是以字节为单位逐个进行I/O操作,在对字符设备发出读写请求后,实际的硬件I/O紧接着就发生了;块设备和字符设备类似,两者之间的区别仅仅在于内核内部管理数据的方式上,也就是内核及驱动程序之间的软件接口上。块设备则是利用一块系统内存作为缓冲区,当用户进程对设备进行读写请求时,驱动程序先查看缓冲区中的内容,如果缓冲区中的数据能满足用户的要求就返回相应的数据,否则就调用相应的请求函数来进行实际的I/O操作。块设备主要是针对磁盘等慢速设备设计的,其目的是避免耗费过多的CPU时间来等待操作的完成。网络设备,任何网络事务都经过一个网络接口,即一个能够和其它主机交换数据的设备。
    Linux系统下的设备驱动程序可以按照两种方式进行编译,一种是直接静态编译成内核的一部分,另一种则是编译成可以动态加载的模块。如果编译进内核的话,会增加内核的大小,还要改动内核的源文件,而且不能动态地卸载,不利于调试,因此推荐使用动态模块加载的方式。
3 PCI-Express驱动程序设计与实现 3.1 PCI-Express驱动程序实现的难点
    传统的PCI/PCI-X总线传输最高突发速率是512Mbps,这远远不能满足对高速信号实时采集处理传输的需要,因此在设计时采用了PCI-Express总线来代替传统的PCI总线。PCI-Express与PCI在软件上兼容,但在硬件上改为串行差分传输,其主要优点是时延短、传输快、带宽提升潜力大和节省空间。PCI-Express采用的是点对点通信机制,各个插槽都将通过各自独享的通道发送和接收数据,这样就可以避免出现不同设备同时争抢系统和CPU资源的情况。PCI-Express有x1、x2、x4、x8、x16和x32多种线宽,如x1的传输带宽为2.5Gbps,x2为5Gbps,依次类推。
    因此与以往PCI设备驱动程序在实现上不同的是基于Linux下的PCI-Express设备的驱动程序必须要注重考虑数据传输的速度和效率。以往的Liunx下PCI设备最大只能申请到11M的DMA内核缓冲区,显而易见这不能满足高速率数据传输的要求,同时在传输过程中对数据的抗抖动性也很差,因此为了能够很好的达到实际的应用要求,同时又能在数据传输过程中具有很好的抗抖动性,如何实现大容量的DMA内核缓冲区的申请、采用何种数据传输模式实现等等都是PCI-Express设备程序在设计时需要重点考虑和深入研究的。
3.2 PCI-Express逻辑结构图
    图1是PCI-Express高速数据采集卡逻辑图。PCI-Express高速数据采集卡对接入的光信号经过光电转换模块进行转换成电信号后,再经过一系列的相关处理后经PCI-Express总线传输通过驱动程序传输至应用软件进行处理,传输带宽为PCI-Express x4。即单方向具有10Gbps的传输带宽。本项目中实现的PCI-Express高速数据采集卡在Linux系统中可以被认为一种字符设备。
    在用模块方式实现PCI-Express设备驱动程序时,通常至少要实现以下几个部分:初始化设备模块、设备打开模块、数据读写和控制模块、中断处理模块、设备释放模块、设备卸载模块等。因此本文下面对如何分配和实现大容量的DMA循环缓冲区、及DMA数据传输处理模式的选择作了重点的研究并进行了详细的阐述。

图1 PCI-Express高速数据采集卡逻辑图

3.3 DMA循环缓冲区的分配与实现
    对于高速数据信号的采集处理,需要在驱动程序的初始化模块中即系统成功加载驱动程序的过程中申请大量的DMA循环缓冲区,DMA缓冲区申请的大小直接关系着能否实时对高速数据处理的成败。直接内存访问或者叫DMA是实现高速数据快速传输处理的一种重要手段,DMA是一种硬件机制,它允许外围设备和主内存之间直接传输它们的I/O数据,而不需要系统处理器的参与,使用这种机制可以大大提高与设备通信的吞吐量,因为DMA的实现避免了大量的计算开销。 
    Linux内核把内存分为三个区段:可用于DMA的内存、常规内存以及高端内存。通常的内存分配都发生在常规内存区,但通过设置内存标志也可以请求在其它区段中分配。可用于DMA的内存是指存在于特别地址范围内的内存,
外设可以利用这些内存执行DMA访问,进行数据通信传输。因此,DMA缓冲区的分配要求是:物理连续、DMA可以访问、足够大。Linux系统是使用虚拟地址的系统,系统的内存分配函数提供的地址都是虚拟地址,必须经过virt_to_bus函数转换才能得到物理地址。分配内核内存空间的函数有三个: kmalloc 该函数实现小于128KB的内核内存的申请,所申请的空间是物理连续的;__get_free_pages实现最大4MB的内存申请(在Linux 2.6的内核下),以页为单位,一次申请或释放的页面数必须为2的幂,可一次允许申请到的最大页面依赖于体系结构,一般为2的(10或11次幂)页面,所申请的空间物理连续;vmalloc 虽然分配的虚拟地址空间是连续区域,但是在物理上可能是不连续的。此外,Linux内核还提供了一个专门用于PCI设备申请内核内存的函数pci_alloc_ consistent,该函数支持按字节长度申请。通过对内核源代码的分析,该函数是通过__get_free_pages函数实现对内核内存的分配,因此,其一次可能的最大分配空间也是4MB[3]
    从上面的分析可以看出,Linux2.6内核中能够用于分配DMA缓冲区的函数有三个:kmalloc、__get_free_pages和pci_alloc_consistent,而且一次最大可分配的内存为4MB。
    因此在高速信号采集处理系统中,必须实现超过4MB的内核内存申请。在本驱动程序的实现中采用了一种类似数组的内存管理机制,用__get_free_pages函数连续申请DMA内存块,然后从这些块地址排序中找到符合要求的连续内存块集,将这些块组成满足驱动程序要求的DMA缓冲区。使用完毕后,再通过这套管理机制释放这些内存块。
    在这里需要说明的是,在大多数健全的系统上,申请DMA内存都是位于上面所述的区段,在x86平台上,DMA驱动是RAM的前16M;对于ISA等老的设备,进行DMA操作必须使用DMA内存区段,虽然对于PCI设备,没有这个限制,但是通过查证相关资料和在实际多次实验中总结可得,用以往的方法对PCI设备申请内存最大也只能申请到11M。因此必须对内存申请进行深入的研究和理解后大胆的进行各种尝试,通过研究发现在64位的系统上根据设置不同的内存分配标志位能申请到更大的符合驱动程序需求的DMA内存。所以在本驱动程序中实现了大小为512M的DMA内存申请,最大可申请到1G大小的
随机推荐
采用VC++面向对象技术构建岩土工程勘察软件
Windows 中断程序设计
军队院校校园网VPN技术应用设想
数据加密技术
数据挖掘中的半结构化数据
IDC中心的ARP攻击与防御解决方案
一种实现双向认证的动态口令身份认证方案
存储虚拟化技术的研究与比较
新型人机交互接口电路的设计及应用
计算机毕业论文范文--学校网络教学

设为首页 | 关于我们 | 广告联系 | 友情链接 | 版权申明

Copyright 2009-2014 All Right Reserved [粤ICP备05100058号-11]