计算机组成原理报告_第1页
计算机组成原理报告_第2页
计算机组成原理报告_第3页
计算机组成原理报告_第4页
计算机组成原理报告_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

TOC\o"1-3"\h\z\u254701.计算机总线系统介绍 3234971.1总线的概念与结构 3108381.2总线接口 4319551.3总线仲裁、定时及数据传送模式 5239672.Windows环境下PCI设备驱动开发 6149502.1PCI配置空间 6201562.2.设备初始化 8228252.3I/O端口访问 10197822.4设备内存访问 10147722.5中断处理 12208122.6DMA通信过程 13计算机组成原理报告--浅论Windows下PCI设备驱动开发在一学期的计算机组成原理的课程学习中,我了解了计算机系统的基本组成结构、基本功能及其实现方式等知识。本课程主要介绍的是硬件层次上是如何构建出基于冯·诺依曼体系的现代计算机系统的支持架构,我一直从事Windows底层驱动的开发工作,软件的开发也是依赖于硬件的工作机制,希望能对二者之间的联系做一点的讨论。以WindowsNTX86架构为例,上层应用分属于不同的子系统,通过系统调用(调用NativeAPI)的方式将处理器从用户模式转换到特权模式来实现对系统资源的访问,包括诸如寄存器、内存与外围设备等系统资源。从驱动开发的角度即是上层应用通过系统调用的方式产生IRP(I/ORequest)请求,I/O管理器按照IRP的主功能号将其发给不同的设备栈,从而实现对于系统资源的访问。而现代操作系统为了实现在多种硬件平台上的可移植性,在内核与硬件的接口处多提供HAL(硬件抽象层)。HAL是一个可以加载的核心态模块,它为运行在WindowsNT上的硬件平台提供低级接口,所有不同硬件结构之间的差异由HAL在内部处理,它隐藏了各种与硬件有关的细节,例如I/O接口、终端控制器以及多处理器通信机制等任何体系结构专用的和依赖于计算机的函数。本文中,以总线的开发为例介绍总线的基本结构与工作原理在实际设备驱动开发中的实际运用。PCI是外围设备互连(PeripheralComponentInterconnect)的简称,作为一种通用的总线接口标准,它在目前的计算机系统中得到了非常广泛的应用。PCI提供了一组完整的总线接口规范,其目的是描述如何将计算机系统中的外围设备以一种结构化和可控化的方式连接在一起,同时它还刻画了外围设备在连接时的电气特性和行为规约,并且详细定义了计算机系统中的各个不同部件之间应该如何正确地进行交互。无论是在基于Intel芯片的PC机中,或是在基于Alpha芯片的工作站上,PCI毫无疑问都是目前使用最广泛的一种总线接口标准。鉴于PCI在不同的操作系统中都有广泛运用并且差异性较小,本文将重点介绍PCI设备驱动的开发。前内存地址寄存器。(6)程序中断:每当外围设备向CPU请求某种动作时,接口即发送一个中断请求信号到CPU。1.3总线仲裁、定时及数据传送模式为了解决多个主设备同时竞争总线控制权,必须具有总线仲裁部件,以某种方式选择其中一个主设备作为总线的下一次主方。按照总线仲裁电路的位置不同,仲裁方式分为集中式仲裁和分布式仲裁两类。①集中式仲裁若总线仲裁逻辑集中于一个单元,称为集中式仲裁。集中式仲裁中每个功能模块有两条线连到中央仲裁器:一条是送往仲裁器的总线请求信号线BR,一条是仲裁器送出的总线授权信号线BG。BS(总线忙):当某外设正使用总线时,BS=“1”。集中控制是单总线、双总线和三总线结构机器中主要采用的方式。链式查询方式中总线授权信号BG串行地从一个I/O接口传送到下一个I/O接口。②分布式仲裁分布式仲裁是以优先级仲裁策略为基础。分布式仲裁不需要中央仲裁器,每个潜在的主方功能模块都有自己的仲裁号和仲裁器。当它们有总线请求时,把它们唯一的仲裁号发送到共享的仲裁总线上,每个仲裁器将仲裁总线上得到的号与自己的号进行比较。如果仲裁总线上的号大,则它的总线请求不予响应,并撤消它的仲裁号。最后,获胜者的仲裁号保留在仲裁总线上。总线的一次信息传送过程,大致可分为如下五个阶段:请求总线,总线仲裁,寻址(目的地址),信息传送,状态返回(或错误报告)。为了同步主方、从方的操作,必须制订定时协议。同步定时中事件出现在总线上的时刻由总线时钟信号来确定。在异步定时协议中,后一事件出现在总线上的时刻取决于前一事件的出现,即建立在应答式或互锁机制基础上。在这种系统中,不需要统一的共公时钟信号。总线周期的长度是可变的。当代的总线标准大都能支持以下四类模式的数据传送:读、写操作:读操作是由从方到主方的数据传送,写操作是由主方到从方的数据传送。块传送操作:只需给出块的起始地址,然后对固定块长度的数据一个接一个地读出或写入。对于CPU(主方)、存储器(从方)而言的块传送,常称为猝发式传送,其块长一般固定为数据线宽度(存储器字长)的4倍。写后读、读修改写操作:只给出地址一次,或进行先写后读操作,或进行先读后写操作。先写后读操作:用于校验;先读后写操作:用于多道程序系统中对共享存储资源的保护。一般而言,数据传送只在一个主方和一个从方之间进行。但有的总线允许一个主方对多个从方进行写操作,这种操作称为广播。与广播相反的操作称为广集,它将选定的多个从方数据在总线上完成AND或OR操作,用以检测多个中断源。Windows环境下PCI设备驱动开发2.1PCI配置空间每个PCI设备都有自己的配置空间,用于支持即插即用,使之满足现行的系统配置结构。下面对PCI配置空间做一下简要介绍。配置空间是一容量为256字节并具有特定结构的地址空间。这个空间又分为头标区和设备有关区两部分。头标区的长度是64字节,每个设备都必须配置该区的寄存器。该区中的各个字段用来唯一地识别设备。其余的192字节因设备而异。配置空间的头标区64个字节的使用情况如图1示。为了实现即插即用,系统可根据硬件资源的使用情况,为PCI设备分配新的资源。因此编写设备驱动程序重点是获得基址寄存器(BaseAddress)和中断干线寄存器的内容。配置空间共有六个基址寄存器和一个中断干线寄存器,具体用法如下:PCIBaseAddress0寄存器:系统利用此寄存器为PCI接口芯片的配置寄存器分配一段PCI地址空间,通过这段地址我们可以以内存映射的形式访问PCI接口芯片的配置寄存器。PCIBaseAddress1寄存器:系统利用此寄存器为PCI接口芯片的配置寄存器分配一段PCI地址空间,通过这段地址我们可以以I/O的形式访问PCI接口芯片的配置寄存器。PCIBaseAddress2、3、4、5寄存器:系统BIOS利用这些寄存器分配PCI地址空间以支持PCI接口芯片的局部配置寄存器0、1、2、3的访问。在所有基址寄存器中,第0位均为只读位,表示这段地址映射到存储器空间还是I/O空间,如果是“1”表示映射到I/O空间,如果是“0”则表示映射到存储器空间。中断干线寄存器(InterruptLine):用于说明中断线的连接情况,这个寄存器的值与标准8259的IRQ编号(0~15)对应。Byte3Byte2Byte1Byte0DeviceIDVendorIDPCIStatusPCICommandClassCodeRevisionIDBuilt-InSelfTestHeaderTypeLatencyTimerCacheLineSizeBaseAddressRegister0~5ReservedSpaceReservedSpaceExpansionROMBaseAddressReservedSpaceReservedSpaceMax.LatencyMin.GrantInterruptPinInterruptLine表1PCI配置空间2.2.设备初始化PCI设备驱动程序要完成识别PCI器件、寻找PCI硬件的资源和对PCI器件中断的服务。在驱动程序初始化过程中,使用HalGetBusData()函数完成寻找PCI设备的工作。在初始化过程中,使用器件识别号(DeviceID)和厂商识别号(VendorID),通过遍历总线上的所有设备,寻找到指定的PCI设备,并获取设备的总线号,器件号与功能号。通过这些配置信息,可以在系统中寻址该设备的资源配置列表。在此之后,驱动程序需要从配置空间获取硬件的参数。PCI设备的中断号、端口地址的范围(I/O)方式、存储器的地址与映射方式等,都可以从硬件资源列表数据结构中获取。在WindowsNT中,调用HalAssignSlotResources()函数来获得指定设备的资源列表数据结构指针,然后通过遍历该列表中的所有资源描述符,获取该设备的I/O端口基地址与长度,中断的中断级、中断向量与模式,存储器基地址与长度等硬件资源数据。我们设计的DMA通信采用总线主控方式进行通信,在设备初始化时需要对DMA适配器进行初始化,使用HalGetAdapter()获得操作系统分配的适配器对象指针。示例代码如下://遍历总线,获得指定设备的总线号,器件号与功能号for(busNumber=0;busNumber<MAX_PCI_BUSES;busNumber++){for(deviceNumber=0;deviceNumber<PCI_MAX_DEVICES;deviceNumber++){slotNumber.u.bits.DeviceNumber=deviceNumber;for(functionNumber=0;functionNumber<PCI_MAX_FUNCTION;functionNumber++){slotNumber.u.bits.FunctionNumber=functionNumber;if(!HalGetBusData(PCIConfiguration,busNumber,slotNumber.u.AsULONG,&pciData,sizeof(ULONG))){deviceNumber=PCI_MAX_DEVICES;break;}if(pciData.VendorID==PCI_INVALID_VENDORID){continue;}if((VendorId!=PCI_INVALID_VENDORID)&&(pciData.VendorID!=VendorId||pciData.DeviceID!=DeviceId)){continue;}pPciDeviceLocation->BusNumber=busNumber;pPciDeviceLocation->SlotNumber=slotNumber;pPciDeviceLocation=&PciDeviceList->List[++count];status=STATUS_SUCCESS;}}}//获取设备的资源列表数据指针status=HalAssignSlotResources(RegistryPath,&pDevExt->ClassUnicodeString,DriverObject,DeviceObject,pDevExt->InterfaceType,pDevExt->BusNumber,pDevExt->SlotNumber,&pCmResourceList);2.3I/O端口访问在PC机上,I/O寻址方式与内存寻址方式不同,所以处理方法也不同。I/O空间是一个64K字节的寻址空间,I/O寻址没有实模式与保护模式之分,在各种模式下寻址方式相同。在WindowsNT下,系统不允许处于Ring3级的用户程序和用户模式驱动程序直接使用I/O指令,对I/O端口进行访问,任何对I/O的操作都需要借助内核模式驱动来完成。在访问I/O端口时,使用READ_PORT_XXX与WRITE_PORT_XXX函数来进行读写。I/O端口基地址使用从配置空间基址寄存器PCIBaseAddress1中返回的I/O端口基地址。示例代码如下:RegValue=READ_PORT_ULONG(pBaseAddr+RegOffSet);WRITE_PORT_ULONG(pBaseAddr+RegOffset,RegValue);2.4设备内存访问Winsows工作在32位保护模式下,保护模式与实模式的根本区别在于CPU寻址方式上的不同,这也是Windows驱动程序设计中需要着重解决的问题。Windows采用了分段、分页机制,使得一个程序可以很容易地在物理内存容量不一样的、配置范围差别很大的计算机上运行,编程人员使用虚拟存储器可以写出比任何实际配置的物理存储器都大得多的程序。每个虚拟地址由16位的段选择字和32位段偏移量组成。通过分段机制,系统由虚拟地址产生线性地址。再通过分页机制,由线性地址产生物理地址。线性地址被分割成页目录(PageDirectory)、页表(PageTable)和页偏移(Offset)三个部分。当建立一个新的Win32进程时,操作系统会为它分配一块内存,并建立它自己的页目录、页表,页目录的地址也同时放入进程的现场信息中。当计算一个地址时,系统首先从CPU控制器CR3中读出页目录所在的地址,然后根据页目录得到页表所在的地址,再根据页表得到实际代码/数据页的页帧,最后再根据页偏移访问特定的单元。硬件设备读写的是物理内存,但应用程序读写的是虚拟地址,所以存在着将物理内存地址映射到用户程序线性地址的问题。从物理内存到线性地址的转换是驱动程序需要完成的工作,可以在初始化驱动程序的进行。在已经获得设备的存储器基地址后,首先调用HalTranslateBusAddress()函数将总线相关的内存地址转换成系统的物理地址,然后调用MmMapIoSpace()函数将系统的物理地址映射到线性地址空间。在需要访问设备内存时,调用READ_REGISTER_XXX()与WRITE_REGISTER_XXX()函数来进行,基地址使用前面映射后的线性地址。在设备卸载时,调用MmUnmapIoSpace()断开设备内存与线性地址空间的映射。示例代码如下:HalTranslateBusAddress(InterfaceType,BusNumber,BaseAddress->RangeStart,&addressSpace,&cardAddress))BaseAddress->MappedRangeStart=MmMapIoSpace(cardAddress,BaseAddress->RangeLength,MmCached);……RegValue=READ_REGISTER_ULONG(pRegister);WRITE_REGISTER_ULONG(pRegister,pInBuf->RegValue);……MmUnmapIoSpace(pBaseAddress->MappedRangeStart,pBaseAddress->RangeLength);2.5中断处理中断的设置、响应与调用在驱动程序中完成。设置中断应该在设备创建时完成,使用从CmResourceTypeInterrupt描述符中提取的参数,先调用HalGetInterruptVector()将与总线有关的中断向量参数转换为系统的中断向量,然后调用IoConnectInterrupt()指定中断服务,注册中断服务函数ISR(InterruptServiceRoutine)的函数指针。

当硬件设备产生中断时,系统会自动调用ISR函数来响应中断。ISR函数运行的中断请求级较高,主要完成对硬件设备中断的清除,不适合执行过多的代码。在传输大块数据时,需要使用延迟过程调用(DelayProcessCall,DPC)机制。例如,使用PCI设备进行DMA通信时,在ISR函数中完成对指定设备中断的判断以及清除中断,在退出ISR前,调用DPC函数;在DPC函数中,完成DMA通信的过程,并将数据返回给用户程序。示例代码如下:DeviceExtension->InterruptLevel=partialData->u.Interrupt.Level;DeviceExtension->InterruptVector=partialData->u.Interrupt.Vector;DeviceExtension->InterruptAffinity=partialData->u.Interrupt.Affinity;if(partialData->Flags&CM_RESOURCE_INTERRUPT_LATCHED){DeviceExtension->InterruptMode=Latched;}else{DeviceExtension->InterruptMode=LevelSensitive;}……vector=HalGetInterruptVector(pDevExt->InterfaceType,pDevExt->BusNumber,pDevExt->InterruptLevel,pDevExt->InterruptVector,&irql,&affinity);status=IoConnectInterrupt(&pDevExt->InterruptObject,(PKSERVICE_ROUTINE)PciDmaISR,DeviceObject,NULL,vector,irql,irql,pDevExt->InterruptMode,TRUE,affinity,FALSE);2.6DMA通信过程DMA通信在驱动程序中实现,需要多个例程才能完成一次DMA通信。1)DriverEntry例程构造DEVICE_DESCRIPTION结构,并调用HalGetAdapter,找到与设备关联的Adapter对象,并将返回的Adapter对象的地址和映射寄存器的数目保存在设备扩展的数据结构中。示例代码://申请DMA的适配器对象deviceDescription.Version=DEVICE_DESCRIPTION_VERSION;deviceDescription.Master=TRUE;deviceDescription.ScatterGather=pDevExt->ScatterGather;deviceDescription.DemandMode=FALSE;deviceDescription.AutoInitialize=FALSE;deviceDescription.Dma32BitAddresses=TRUE;deviceDescription.BusNumber=pDevExt->BusNumber;deviceDescription.InterfaceType=pDevExt->Interface

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论