Linux下PCI设备驱动程序开发

肖文鹏 (xiaowp@263.net), 硕士研究生, 北京理工大学计算机系
2004 年 3 月 09 日
pci是一种广泛采用的总线标准,它提供了许多优于其它总线标准(如eisa)的新特性,目前已经成为计算机系统中应用最为广泛,并且最为通用的总线标准。linux的内核能较好地支持pci总线,本文以intel 386体系结构为主,探讨了在linux下开发pci设备驱动程序的基本框架。
pci是外围设备互连(peripheral component interconnect)的简称,作为一种通用的总线接口标准,它在目前的计算机系统中得到了非常广泛的应用。pci提供了一组完整的总线接口规范,其目的是描述如何将计算机系统中的外围设备以一种结构化和可控化的方式连接在一起,同时它还刻画了外围设备在连接时的电气特性和行为规约,并且详细定义了计算机系统中的各个不同部件之间应该如何正确地进行交互。
无论是在基于intel芯片的pc机中,或是在基于alpha芯片的工作站上,pci毫无疑问都是目前使用最广泛的一种总线接口标准。同旧式的isa总线不同,pci将计算机系统中的总线子系统与存储子系统完全地分开,cpu通过一块称为pci桥(pci-bridge)的设备来完成同总线子系统的交互,如图1所示。
由于使用了更高的时钟频率,因此pci总线能够获得比isa总线更好的整体性能。pci总线的时钟频率一般在25mhz到33mhz范围内,有些甚至能够达到66mhz或者133mhz,而在64位系统中则最高能达到266mhz。尽管目前pci设备大多采用32位数据总线,但pci规范中已经给出了64位的扩展实现,从而使pci总线能够更好地实现平台无关性,现在pci总线已经能够用于ia-32、alpha、powerpc、sparc64和ia-64等体系结构中。
pci总线具有三个非常显著的优点,使得它能够完成最终取代isa总线这一历史使命:
在计算机和外设间传输数据时具有更好的性能; 能够尽量独立于具体的平台; 可以很方便地实现即插即用。  
图2是一个典型的基于pci总线的计算机系统逻辑示意图,系统的各个部分通过pci总线和pci-pci桥连接在一起。从图中不难看出,cpu和ram需要通过pci桥连接到pci总线0(即主pci总线),而具有pci接口的显卡则可以直接连接到主pci总线上。pci-pci桥是一个特殊的pci设备,它负责将pci总线0和pci总线1(即从pci主线)连接在一起,通常pci总线1称为pci-pci桥的下游(downstream),而pci总线0则称为pci-pci桥的上游(upstream)。图中连接到从pci总线上的是scsi卡和以太网卡。为了兼容旧的isa总线标准,pci总线还可以通过pci-isa桥来连接isa总线,从而能够支持以前的isa设备。图中isa总线上连接着一个多功能i/o控制器,用于控制键盘、鼠标和软驱。
在此我只对pci总线系统体系结构作了概括性介绍,如果读者想进一步了解,david a rusling在the linux kernel(http://tldp.org/ldp/tlk/dd/pci.html)中对linux的pci子系统有比较详细的介绍。
linux将所有外部设备看成是一类特殊文件,称之为“设备文件”,如果说系统调用是linux内核和应用程序之间的接口,那么设备驱动程序则可以看成是linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件在实现上的细节,使得应用程序可以像操作普通文件一样来操作外部设备。
linux抽象了对硬件的处理,所有的硬件设备都可以像普通文件一样来看待:它们可以使用和操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和i/o控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。linux系统中的所有硬件设备都使用一个特殊的设备文件来表示,例如,系统中的第一个ide硬盘使用/dev/hda表示。每个设备文件对应有两个设备号:一个是主设备号,标识该设备的种类,也标识了该设备所使用的驱动程序;另一个是次设备号,标识使用同一设备驱动程序的不同硬件设备。设备文件的主设备号必须与设备驱动程序在登录该设备时申请的主设备号一致,否则用户进程将无法访问到设备驱动程序。
在linux操作系统下有两类主要的设备文件:一类是字符设备,另一类则是块设备。字符设备是以字节为单位逐个进行i/o操作的设备,在对字符设备发出读写请求时,实际的硬件i/o紧接着就发生了,一般来说字符设备中的缓存是可有可无的,而且也不支持随机访问。块设备则是利用一块系统内存作为缓冲区,当用户进程对设备进行读写请求时,驱动程序先查看缓冲区中的内容,如果缓冲区中的数据能满足用户的要求就返回相应的数据,否则就调用相应的请求函数来进行实际的i/o操作。块设备主要是针对磁盘等慢速设备设计的,其目的是避免耗费过多的cpu时间来等待操作的完成。一般说来,pci卡通常都属于字符设备。
所有已经注册(即已经加载了驱动程序)的硬件设备的主设备号可以从/proc/devices文件中得到。使用mknod命令可以创建指定类型的设备文件,同时为其分配相应的主设备号和次设备号。例如,下面的命令:
[root@gary root]# mknod /dev/lp0 c 6 0

计算机通信与网络v2 实验课程(13)
RAK13101 GSM/GPRS蜂窝模块,支持Nano SIM和ESIM
小间距LED显示屏的选购指南及注意点
有源DASCPRI接口的解决方案
LED幕墙灯的原理_LED幕墙灯的优势
Linux下PCI设备驱动程序开发
光伏电站的分类
车用传感器解析及各类传感器图解
电脑装上两颗CPU 性能会不会翻倍
如何避免数字货币被黑客掠夺
玩手机游戏不卡顿 骁龙855 Plus助力高帧率游戏体验
tpu是什么材料_tpu硬度范围_tpu的应用
土耳其货币崩溃,加密货币为何无法拯救?
物联网将加速推动医疗领域转型升级
织物折皱回复性试验仪的用途以及主要特点
STM32串口实现485双机通信的原理
什么是超级终端_超级终端是干什么用的
调查显示:消费者愿意多支付20%的费用来购买5G智能手机
新思科技完善软件安全计划并已经迎来了第11个版本
基于MPLS的VPN技术原理及其实现