PCI

一、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區域,這點是比較容易理解的。除此之外,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)



Host bridge:                         ----> 主板芯片
VGA compatible controller    ----> 顯卡
Audio device                        ----> 音頻設備
PCI bridge                            ----> 接口插槽
USB Controller                      ----> USB控制器
ISA bridge                                
IDE interface                         ----> 硬盤驅動器
SMBus                                  ----> System Management Bus
Ethernet controller                ----> 網卡

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章