您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 第6章第 硬件和设备驱动程序
第6章硬件和设备驱动程序本章介绍Linux系统中常见的设备以及一些相关概念,讨论Linux核心对系统中物理设备的管理,介绍Linux对PCI总线的支持、Linux对硬件中断的处理以及对设备驱动程序的支持等。在Linux的安装和系统维护中,会遇到许多与特定硬件或设备相关的问题。这些问题的正确解决建立在对相关概念的正确理解之上。第6章硬件和设备驱动程序第一节总线第二节设备访问方式第三节设备驱动程序第四节编写Linux下的设备驱动程序6.1总线6.1.1总线概述总线是将计算机中不同类型的硬件组织在一起,并为它们提供通讯保证的计算机关键硬件。总线定义了硬件之间进行通讯的“协议”,遵循同一种协议的硬件可在同一条总线上协调工作。物理上,总线由计算机主板上传送信号的线路以及附属的控制芯片组成。各种设备大多以控制卡的形式插在总线槽上。总线协议包括一些物理上的约定,例如电气特性以及控制卡的尺寸等。另外,总线协议也定义了总线上的信号时序以及总线的最大数据传输速率(以MHz为单位)等特性。不同的协议形成了不同的总线。在流行PC机中,常见的总线类型如表6.1所示。表6.1PC中的常见总线类型名称说明ISA总线ISA是“IndustyStandardArchitecture”的英文缩写。ISA总线最初用于IBM的PCAT机中,一次可传输16位数据,最大的数据传输率为5MB/sec。VESA局部总线VESA是“VideoElectronicsStandardsAssociation视频电子标准协会”的英文缩写。VESA局部总线可提供处理器和视频卡之间的高速数据传输。EISA总线EISA是“ExtendedIndustyStandardArchitecture扩展工业标准结构”的英文缩写。EISA总线的传输速率为30MB/sec。但该总线很少使用。PCI总线PCI是“PeripheralComponentInterconnection,外设组件互连”的英文缩写。PCI是最新的高性能总线。它的时钟频率为33MHz,一次可传输64位数据。Linux不支持微通道结构总线MCA(MicroChannelArchitecture)。Linux不支持微通道结构总线MCA(MicroChannelArchitecture)。外设组件互连(PeripheralComponentInterconnection,PCI)是一种将系统中外部设备以结构化与可控制方式连接到起来的总线标准,包括系统部件连接的电气特性及行为。PCI总线现在广泛使用在基于Pentium的计算机中,一方面是因为该总线的数据吞吐量大,另一方面是因为该总线和具体的处理器无关,也就是说,同一个PCI设备,既可以使用在i386计算机中,也可以使用在AlphaAXP计算机中。PCI总线的设计也使各种PCI外设卡可即插即用,但即插即用需要操作系统软件额外的支持。6.1.2Linux对PCI总线的支持1.PCI总线的结构6.1.2Linux对PCI总线的支持1.PCI总线的结构图6.1是一个简单的PCI系统的逻辑示意图。每条PCI总线上的设备数目是有一定限制的,因此该系统使用PCI-PCI桥将不同的PCI总线粘合在一起。不同的PCI总线有唯一的编号,CPU处于PCI0号总线上。利用PCI-ISA桥可在PCI总线上连接ISA总线。利用PCI-PCI桥和PCI-ISA桥,可以突破单个PCI总线的限制而连接许多设备。一般来说,服务器和桌面计算机的PCI总线拓扑结构是不同的。图6.1简单的PCI系统逻辑示意图ISA设备有两种地址空间,一种是I/O端口空间,另一种是存储器空间。和ISA设备相比较,PCI设备有三种地址空间,分别是I/O端口空间、存储器空间和配置空间。不同的CPU类型对地址空间类型的支持不同,i386处理器的I/O端口和存储器空间是分开的,利用不同的处理器指令操作这些地址;AlphaAXP处理器却只有存储器空间,也就是说,端口的输入输出和内存访问的指令是一样的。因此,AlphaAXP处理器利用一种独特的内存映射方式将部分虚拟地址空间映射为PCI的地址空间。ISA设备有两种地址空间,一种是I/O端口空间,另一种是存储器空间。和ISA设备相比较,PCI设备有三种地址空间,分别是I/O端口空间、存储器空间和配置空间。不同的CPU类型对地址空间类型的支持不同,i386处理器的I/O端口和存储器空间是分开的,利用不同的处理器指令操作这些地址;AlphaAXP处理器却只有存储器空间,也就是说,端口的输入输出和内存访问的指令是一样的。因此,AlphaAXP处理器利用一种独特的内存映射方式将部分虚拟地址空间映射为PCI的地址空间。PCI的前两种地址空间和ISA的两种地址空间类似,设备驱动程序利用这些地址空间在系统和设备之间通讯。除此之外,PCI设备,包括PCI-PCI桥和PCI-ISA桥都包含称为“配置头”的数据结构,这些数据结构包含在PCI设备的配置空间中。配置头在配置空间中的位置和相应的PCI插槽相关,系统可以利用这些配置头来判断相应的PCI插槽中是否存在PCI设备。图6.2是PCI设备头的结构示意图。一般来说,设备头的长度为256字节,利用与特定硬件相关的代码可读取这些设备头。根据其中的信息,操作系统可为每个已插入PCI插槽的PCI设备分配PCII/O端口的数量、地址,以及PCI存储器的长度和起始位置(由基地址寄存器定义),也可以配置PCI设备的中断以及中断请求线。但是只有专门为特定硬件系统设计的配置代码才可以读取和设置这些信息,在i386系统中,这种代码通常由系统BIOS提供。详细信息可参见有关的PCI总线规范。图6.2PCI设备的设备头结构2.Linux中PCI设备的初始化Linux中的PCI设备初始代码可划分为如下三个部分:PCIBIOS、PCI修正和PCI设备驱动程序。PCIBIOS由一组标准的PCI设备访问功能函数组成,这些代码对不同的平台来说是一样的。PCI修正部分为非Intel的系统所特有。Intel的系统引导时,可由系统BIOS完整配置PCI系统,而对AlphaAXP系统来说,需要利用PCI修正代码来完成PCI系统的配置。PCI设备驱动程序实际并不是一个真正的设备驱动程序,它只在引导时由操作系统调用进行PCI设备的初始化。本章主要讨论PCI设备驱动程序。PCI设备驱动程序利用PCIBIOS的功能函数在系统中扫描所有的PCI设备(包括两种桥设备),并建立如图6.3所示的数据结构。图6.3中的数据结构与图6.1所示的PCI系统相对应。PCI初始化代码首先扫描PCI0号总线,为每个可能的PCI插槽读取设备头中的制造商标识和设备标识。如果发现一个已填充有效标识信息的设备头,则说明对应的PCI插槽中有合法的PCI设备,因此,系统为该设备建立一个pci_dev结构。同一总线上所有的pci_dev数据结构形成了一个pci_devices链表。PCI设备驱动程序利用PCIBIOS的功能函数在系统中扫描所有的PCI设备(包括两种桥设备),并建立如图6.3所示的数据结构。图6.3中的数据结构与图6.1所示的PCI系统相对应。PCI初始化代码首先扫描PCI0号总线,为每个可能的PCI插槽读取设备头中的制造商标识和设备标识。如果发现一个已填充有效标识信息的设备头,则说明对应的PCI插槽中有合法的PCI设备,因此,系统为该设备建立一个pci_dev结构。同一总线上所有的pci_dev数据结构形成了一个pci_devices链表。如果在搜索0号总线时发现PCI-PCI桥设备,则系统会建立一个pci_bus结构,并和代表PCI0号总线的pci_bus结构以及pci_dev结构一起形成一个由pci_root所指的树形结构。接下来,初始化代码将继续在次总线上扫描其他PCI设备,直到扫描完所有的PCI设备为止。如果在次总线上发现有PCI-PCI桥设备,则初始化代码会继续扫描次总线。图6.3Linux内核中的PCI数据结构6.2设备访问方式6.2.1查询与中断外设的操作通常耗时较长,因此,当CPU实际执行了命令指令之后,驱动程序可采用两种方式等待外设完成操作。一种是查询方式,驱动程序在提交命令之后就开始查询设备的状态寄存器,当状态寄存器表明操作完成时,驱动程序可继续后续处理。另一种方式是利用中断,驱动程序提交命令之后立即进入休眠状态(即放弃CPU的使用权,而其他进程就有机会运行了),设备结束操作之后,会产生中断信号,操作系统则根据设备的中断信号负责唤醒驱动程序。显然,查询方式白白浪费了大量的CPU时间,而中断方式才是多任务操作系统中最有效利用CPU的方式。图6.432位i386PC的中断处理硬件查询方式实际是同步驱动设备的方式,而中断方式实际是异步驱动设备的方式,利用中断,系统可更加有效地利用CPU。(1)对某些设备,例如软盘驱动器,其IRQ是固定的。软盘驱动器的IRQ为6。(2)设备驱动程序可通过探测程序自动探测某些ISA设备的IRQ。(3)不能自动探测的ISA设备,可通过启动参数指定设备的IRQ。(4)对PCI设备,设备的配置头信息中已经存在有相应的设备IRQ,设备驱动程序只需读取该配置信息。查询方式实际是同步驱动设备的方式,而中断方式实际是异步驱动设备的方式,利用中断,系统可更加有效地利用CPU。(1)对某些设备,例如软盘驱动器,其IRQ是固定的。软盘驱动器的IRQ为6。(2)设备驱动程序可通过探测程序自动探测某些ISA设备的IRQ。(3)不能自动探测的ISA设备,可通过启动参数指定设备的IRQ。(4)对PCI设备,设备的配置头信息中已经存在有相应的设备IRQ,设备驱动程序只需读取该配置信息。对ISA设备IRQ的探测过程如下。设备驱动程序要求设备完成某项可导致中断的操作,然后,系统打开所有未被分配的中断。如果设备产生中断,系统将接收到该中断,然后通过读取中断控制器的状态寄存器可得知该中断对应的IRQ,它就是ISA设备的IRQ。当然,这种探测方式在某些情况下是无法正常工作的。例如,当ISA设备的I/O地址空间也未知时就无法利用这种方式。在配置ISA网络卡的时候,这种情况经常发生。这时就需要利用启动参数指定设备的IRQ和I/O端口地址。对PCI设备,由于可方便获得设备配置头信息中的IRQ,因此设置工作相对容易些。但因为PCI设备只能在四个引脚(分别为A、B、C和D)上产生中断,所以当系统中有四个以上的PCI设备时,就会发生IRQ重叠的情况。这时,irq_action数组中的某个元素会同时指向多个irqaction结构,而当产生该IRQ中断时,Linux会依次调用每个irqaction指定的中断处理程序。在设备驱动程序的中断处理过程中,设备驱动程序读取设备状态寄存器的值,从而可了解操作结果。在某些特定情况下,设备驱动程序还要进行其他处理,但中断处理过程中只读取设备状态,以便能够快速结束中断处理。如果还要进行其他处理,会通过内核机制在适当的时候进行。如何将中断发送给CPU取决于体系结构,但是在多数体系结构中,中断以一种特殊模式发送同时还将阻止系统中其它中断的产生。设备驱动在其中断处理过程中作的越少越好,这样Linux核心将能很快的处理完中断并返回中断前的状态中。为了在接收中断时完成大量工作,设备驱动必须能够使用核心的底层处理例程或者任务队列来对以后需要调用的那些例程进行排队。6.2.2直接内存访问利用中断,系统和设备之间可以通过设备驱动程序传送数据,但是,当传送数据量很大时,因为中断处理上的延迟,利用中断的方式就不太有效了。例如,SCSI硬盘可在1秒之内传输50MB的数据,而通常的中断延迟(中断产生到相应的设备驱动程序被调用之间的时间)大约为2ms,显然,利用中断对整体数据传输速度的影响是非常大的。直接内存访问(DirectMemoryAccess,DMA)控制器可以在不受处理器干预的情况下在设备和系统内存之间高速传输数据。PC机的ISADMA控制器有8个DMA
本文标题:第6章第 硬件和设备驱动程序
链接地址:https://www.777doc.com/doc-1314416 .html