1, PCI有几种存储空间?
设备在系统的PCI地址空间里申请一段来用,所申请的空间基址和大小保存在BAR寄存器里。BAR里的只是PCI域的地址空间,需要映射到IO地址空间里或者内存地址空间里之后软件才能使用。映射到IO空间的话,用IO读写指令和函数去访问设备;映射到内存空间的话,首先得到的是物理地址,映射到虚拟地址后就可以像用指针那样访问。IO BAR和MEM BAR分别是映射到IO空间和内存空间的BAR;BAR寄存器的0位指示要映射到哪,有的设备这位可以由用户设置,有的只读。每个BAR具体干嘛是设备自己定义的,要看手册。
2, pci总线地址和设备本身的内存空间的区别
PCI配置空间简介 作者:敏行PCI有三个相互独立的物理地址空间:设备存储器地址空间、I/O地址空间和配置空间。配置空间是PCI所特有的一个物理空间。由于PCI支持设备即插即用,所以PCI设备不占用固定的内存地址空间或I/O地址空间,而是由操作系统决定其映射的基址。系统加电时,BIOS检测PCI总线,确定所有连接在PCI总线上的设备以及它们的配置要求,并进行系统配置。所以,所有的PCI设备必须实现配置空间,从而能够实现参数的自动配置,实现真正的即插即用。PCI总线规范定义的配置空间总长度为256个字节,配置信息按一定的顺序和大小依次存放。前64个字节的配置空间称为配置头,对于所有的设备都一样,配置头的主要功能是用来识别设备、定义主机访问PCI卡的方式(I/O访问或者存储器访问,还有中断信息)。其余的192个字节称为本地配置空间,主要定义卡上局部总线的特性、本地空间基地址及范围等。访问PCI配置空间方法一访问PCI配置空间可通过两个访问寄存器,CONFIG_ADDRESS寄存器和CONFIG_DATA寄存器。这两个寄存器在PC中分别对应着CF8h和CFCh端口,并且是32位端口,即读写要用的32为IN和OUT汇编指令。每个PCI设备可应用三个信息进行定位,即Bus Number、Device Number和Function Number。另外,PCI配置空间一共是256个字节,被分割成64个4字节的寄存器,从0-63编号。每次要访问PCI配置空间时,先设置CONFIG_ADDRESS寄存器,这时CONFIG_DATA存储器的内容就对应着该PCI配置空间中的相应的寄存器。访问PCI配置空间方法二第二种访问配置空间的方法是通过HalGetBusData和HalSetBusData两个内核函数。这两个函数将方法进行了封装,不需要程序员对PCI空间进行直接读取。DDK提供了两个内核函数HalGetBusData和HalSetBusData,分别用于读取PCI设备的配置空间和设置PCI配置空间。
3, PCI配置空间的问题
PCI有三个相互独立的物理地址空间:设备存储器地址空间、I/O地址空间和配置空间。配置空间是PCI所特有的一个物理空间。由于PCI支持设备即插即用,所以PCI设备不占用固定的内存地址空间或I/O地址空间,而是由操作系统决定其映射的基址。系统加电时,BIOS检测PCI总线,确定所有连接在PCI总线上的设备以及它们的配置要求,并进行系统配置。所以,所有的PCI设备必须实现配置空间,从而能够实现参数的自动配置,实现真正的即插即用。PCI总线规范定义的配置空间总长度为256个字节,配置信息按一定的顺序和大小依次存放。前64个字节的配置空间称为配置头,对于所有的设备都一样,配置头的主要功能是用来识别设备、定义主机访问PCI卡的方式(I/O访问或者存储器访问,还有中断信息)。其余的192个字节称为本地配置空间,主要定义卡上局部总线的特性、本地空间基地址及范围等。
4, 如何访问PCI配置空间
1、pci芯片的配置寄存器分为pci配置寄存器pci configuration registers和局部配置寄存器local configuration registers。这个我看pci9054 databook时一直以为local configuration registers是说dsp上的寄存器。。。太久没做事情了,这个英文和中文都断点了。。。2、6个pci bar(0-5),其中bar2-5对应4个局部空间0-3,再加上外部rom,pci总线可以访问5个局部地址空间。一个4个寄存器集合定义了每个空间和空间的特性:pci bar局部范围local range局部基地址local base address局部总线区域描述符local bus region descriptor(指定了局部总线特性,如总线宽度,猝发,预取,和几个等待状态)3、seeprom不能访问pci bar,seeprom可访问局部配置寄存器,bar是主机bios动态分配的。4、PCI初始化软件:PCI主机总线初始化软件通过写PCI Base Address Register写全1然后,读回一个值来决定请求的地址空间。PCI9054在不需要的地址位返回0,来指定请求的地址空间。PCI软件(不是驱动,也不是应用程序,是pci的系统软件)通过编程PCI Base Address Register来映射局部地址空间到PCI地址空间。例如:一个IMB局部地址空间02300000h到023FFFFFH被LLPCI总线的PCI地址78900000h到789FFFFFH来访问。1. 在SEEPROM按如下方式设置范围和Local Base Address Register范围=FFF00000h(1MB,译码高PCI地址的高12位)局部地址(重映射)=023xxxxxh(对于PCI到局部的局部基地址访问)2. PCI初始化软件写全1到PCI基地址寄存器,然后读取返回值。PCI9052返回一个FFF00000H。PCI软件写PCI基地址寄存器:PCI基地址=789xxxxxh(PCI基地址用来访问局部地址空间)5、pci是小端
5, PCI配置空间对应的硬件结构是什么?
PCI Base Address 1寄存器:系统利用此寄存器为PCI接口芯片的配置寄存器分配一段PCI地址空间,通过这段地址我们可以以I/O的形式访问PCI接口芯片的配置寄存器。PCI 设备驱动程序要完成识别PCI器件、寻找PCI硬件的资源和对PCI器件中断的服务。在驱动程序初始化过程中,使用HalGetBusData()函数完成寻找PCI设备的工作。在初始化过程中,使用器件识别号(Device ID)和厂商识别号(Vendor ID),通过遍历总线上的所有设备,寻找到指定的PCI设备,并获取设备的总线号,器件号与功能号。通过这些配置信息,可以在系统中寻址该设备的资源配置列表。在此之后,驱动程序需要从配置空间获取硬件的参数。PCI设备的中断号、端口地址的范围(I/O)方式、存储器的地址与映射方式等,都可以从硬件资源列表数据结构中获取。在Windows NT中,调用HalAssignSlotResources()函数来获得指定设备的资源列表数据结构指针,然后通过遍历该列表中的所有资源描述符,获取该设备的I/O端口基地址与长度,中断的中断级、中断向量与模式,存储器基地址与长度等硬件资源数据。// 遍历总线,获得指定设备的总线号,器件号与功能号for ( busNumber = 0; busNumber BusNumber = busNumber;pPciDeviceLocation->SlotNumber = slotNumber;pPciDeviceLocation = &PciDeviceList->List[++count];status = STATUS_SUCCESS;} } }
名词解释
BAR
bar,压强单位。
IO
I/O输入/输出(Input/Output),分为IO设备和IO接口两个部分。 在POSIX兼容的系统上,例如Linux系统,I/O操作可以有多种方式,比如DIO(Direct I/O),AIO(Asynchronous I/O,异步I/O),Memory-Mapped I/O(内存映射I/O)等,不同的I/O方式有不同的实现方式和性能,在不同的应用中可以按情况选择不同的I/O方式。
映射
映射是一个汉语词汇,读音为yìng shè,意思是映照、照射,也可以指反射反映。出自瞿秋白《饿乡纪程》二:“只是那垂死的家族制之苦痛,在几度回光返照的时候,映射在我心里,影响于我生活。”