• LSPCI具体解释分析


    一、PCI简单介绍
         PCI是一种外设总线规范。我们先来看一下什么是总线:总线是一种传输信号的路径或信道。典型情况是,总线是连接于一个或多个导体的电气连线,总 线上连接的全部设备可在同一时间收到全部的传输内容。总线由电气接口和编程接口组成。本文讨论Linux 下的设备驱动,所以,重点关注编程接口。
         PCI是Peripheral Component Interconnect(外围设备互联)的简称,是普遍使用在桌面及更大型的计算机上的外 设总线。PCI架构被设计为ISA标准的替代品,它有三个主要目标:获得在计算机和外设之间数据传输时更好的性能;尽可能的平台无关;简化往系统中加入和 删除外设的工作。

    二、PCI寻址
         从如今開始,我想尽可能通过一些实际的样例来说明问题,而降低理论方面的问题的描写叙述,由于,相关的理论的东西,能够在其他地方找到。
         我们先来看一个样例,我的电脑装有1G的RAM,1G以后的物理内存地址空间都是外部设备IO在系统内存地址空间上的映射。 /proc/iomem描写叙述了系统中全部的设备I/O在内存地址空间上的映射。我们来看地址从1G開始的第一个设备在/proc/iomem中是怎样描写叙述 的:
                 40000000-400003ff : 0000:00:1f.1
         这是一个PCI设备,40000000-400003ff是它所映射的内存地址空间,占领了内存地址空间的1024 bytes的位置,而 0000:00:1f.1则是一个PCI外设的地址,它以冒号和逗号分隔为4个部分,第一个16位表示域,第二个8位表示一个总线编号,第三个5位表示一 个设备号,最后是3位,表示功能号。

         由于PCI规范同意单个系统拥有高达256个总线,所以总线编号是8位。但对于大型系统而言,这是不够的,所以,引入了域的概念,每一个 PCI域能够拥有最多256个总线,每一个总线上可支持32个设备,所以设备号是5位,而每一个设备上最多可有8种功能,所以功能号是3位。由此,我们能够得 出上述的PCI设备的地址是0号域0号总线上的31号设备上的1号功能。

         那上述的这个PCI设备究竟是什么呢?以下是我的电脑上的lspci命令的输出:
         00:00.0 Host bridge: Intel Corporation 82845 845 (Brookdale) Chipset Host Bridge (rev 04)
         00:01.0 PCI bridge: Intel Corporation 82845 845 (Brookdale) Chipset AGP Bridge(rev 04)
         00:1d.0 USB Controller: Intel Corporation 82801CA/CAM USB (Hub #1) (rev 02)
         00:1d.1 USB Controller: Intel Corporation 82801CA/CAM USB (Hub #2) (rev 02)
         00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev 42)
         00:1f.0 ISA bridge: Intel Corporation 82801CAM ISA Bridge (LPC) (rev 02)
         00:1f.1 IDE interface: Intel Corporation 82801CAM IDE U100 (rev 02)
         00:1f.3 SMBus: Intel Corporation 82801CA/CAM SMBus Controller (rev 02)
         00:1f.5 Multimedia audio controller:Intel Corporation 82801CA/CAM AC'97 Audio Controller (rev 02)
         00:1f.6 Modem: Intel Corporation 82801CA/CAM AC'97 Modem Controller (rev 02)
         01:00.0 VGA compatible controller: nVidia Corporation NV17 [GeForce4 420 Go](rev a3)
         02:00.0 FireWire (IEEE 1394): VIA Technologies, Inc. IEEE 1394 Host Controller(rev 46)
         02:01.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+(rev 10)
         02:04.0 CardBus bridge: O2 Micro, Inc. OZ6933 Cardbus Controller (rev 01)
         02:04.1 CardBus bridge: O2 Micro, Inc. OZ6933 Cardbus Controller (rev 01)
         lspci没有标明域,但对于一台PC而言,一般仅仅有一个域,即0号域。通过这个输出我们能够看到它是一个IDE interface。由上述的 输出能够看到,我的电脑上共同拥有3个PCI总线(0号,1号,2号)。在单个系统上,插入多个总线是通过桥(bridge)来完毕的,桥是一种用来连接总线 的特殊PCI外设。所以,PCI系统的总体布局组织为树型,我们能够通过上面的lspci输出,来画出我的电脑上的PCI系统的树型结构:
    00:00.0(主桥)--00:01.0(PCI桥)-----01:00:0(nVidia显卡)
                       |
                       |---00:1d(USB控制器)--00:1d:0(USB1号控制器)
                       |                    |
                       |                    |--00:1d:1(USB2号控制器)                    |
                       |-00:1e:0(PCI桥)--02:00.0(IEEE1394)
                       |                |
                       |                |-02:01.0(8139网卡)
                       |                |
                       |                |-02:04(CardBus桥)-02:04.0(桥1)
                       |                                   |
                       |                                   |--02:04.1(桥2)
                       |
                       |-00:1f(多功能板卡)-00:1f:0(ISA桥)
                                            |
                                            |--00:1f:1(IDE接口)
                                            |
                                            |--00:1f:3(SMBus)
                                            |
                                            |--00:1f:5(多媒体声音控制器)
                                            |
                                            |--00:1f:6(调制解调器)
         由上图能够得出,我的电脑上共同拥有8个PCI设备,当中0号总线上(主桥)上连有4个,1号总线上连有1个,2号总线上连有3个。00:1f是一个连有5个功能的多功能板卡。
         每一个PCI设备都有它映射的内存地址空间和它的I/O区域,这点是比較easy理解的。除此之外,PCI设备还有它的配置寄存器。有了配置寄存器, PCI的驱动程序就不须要探測就能訪问设备。配置寄存器的布局是标准化的,配置空间的4个字节含有一个独一无二的功能ID,因此,驱动程序可通过查询外设 的特定 ID来识别其设备。所以,PCI接口标准在ISA之上的主要创新在于配置地址空间。
    前文已讲过,PCI驱动程序不须要探測就能訪问设备,而这得益于配置地址空间。在系统引导阶段,PCI硬件设备保持未激活状态,但每一个PCI主板均配备有能够处理PCI的固件,固件通过读写PCI控制器中的寄存器,提供了对设备配置地址空间的訪问。
         配置地址空间的前64字节是标准化的,它提供了厂商号,设备号,版本等信息,唯一标识一个PCI设备。同一时候,它也提供了最多可多达6个的I/O 地址区域,每一个区域能够是内存也能够是I/O地址。这几个I/O地址区域是驱动程序找到设备映射到内存和I/O空间的具体位置的唯一途径。有了这两点, PCI驱动程序就完毕了相当于探測的功能。关于这64个字节的配置空间的具体情况,可參阅《Linux设备驱动程序第三版》P306,不再详述。
         以下,我们来看一下8139too网卡设备的配置空间的具体情况。在2.6内核的系统中,能够在文件夹/sys/bus/pci/drivers/ 下看到非常多以PCI设备名命名的文件夹,但不是说这些设备都存在于你的系统中。我们进入8139too文件夹,当中有一个以它的设备地址0000:02: 01.0命名的文件夹。在这个文件夹下能够找到该网卡设备相关的非常多信息。当中resource记录了它的6个I/O地址区域。内容例如以下:
             0x0000000000003400 0x00000000000034ff 0x0000000000000101
             0x00000000e0000800 0x00000000e00008ff 0x0000000000000200
             0x0000000000000000 0x0000000000000000 0x0000000000000000
             0x0000000000000000 0x0000000000000000 0x0000000000000000
             0x0000000000000000 0x0000000000000000 0x0000000000000000
             0x0000000000000000 0x0000000000000000 0x0000000000000000
             0x0000000000000000 0x0000000000000000 0x0000000000000000
         由该文件能够看出,8139too设备使用了两个I/O地址区域,第一个是它映射的I/O端口范围,第二个是它映射的内存地址空间。关于这两个值能够在/proc/iomem和/proc/ioport中得到验证。

    -[0000:00]-+-00.0
               +-02.0
               +-1d.0
               +-1d.1
               +-1d.2
               +-1d.7
               +-1e.0-[0000:01]--+-02.0
               |                 /-05.0
               +-1f.0
               +-1f.1
               +-1f.3
               /-1f.5
    00:00.0 Host bridge: Intel Corporation 82845G/GL[Brookdale-G]/GE/PE DRAM Controller/Host-Hub Interface (rev 03)
    00:02.0 VGA compatible controller: Intel Corporation 82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device (rev 03)
    00:1d.0 USB Controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 (rev 02)
    00:1d.1 USB Controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 (rev 02)
    00:1d.2 USB Controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 (rev 02)
    00:1d.7 USB Controller: Intel Corporation 82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller (rev 02)
    00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev 82)
    00:1f.0 ISA bridge: Intel Corporation 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge (rev 02)

    (LPC Hub 控制器 1 )
    00:1f.1 IDE interface: Intel Corporation 82801DB (ICH4) IDE Controller (rev 02)
    00:1f.3 SMBus: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller (rev 02)
    00:1f.5 Multimedia audio controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller (rev 02)
    01:02.0 Communication controller: Conexant HSF 56k HSFi Modem (rev 01)
    01:05.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)

  • 相关阅读:
    LC.225. Implement Stack using Queues(using two queues)
    LC.232. Implement Queue using Stacks(use two stacks)
    sort numbers with two stacks(many duplicates)
    LC.154. Find Minimum in Rotated Sorted Array II
    LC.81. Search in Rotated Sorted Array II
    LC.35.Search Insert Position
    前后端分离:(一)
    Redis基本使用(一)
    GIT篇章(二)
    GIT篇章(一)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4246024.html
Copyright © 2020-2023  润新知