- 存儲技術原理分析
- 敖青云著
- 5173字
- 2018-12-27 02:38:23
第3章
PCI子系統(tǒng)
3.1 概述
PCI是外圍設備互連(Peripheral Component Interconnect)的簡稱,它是一種通用總線接口標準。PCI總線是一種常見的主機I/O總線,用于連接高速的外部設備。從1992年創(chuàng)立規(guī)范到如今,PCI逐漸取代之前的技術,成為事實上計算機的標準總線。PCI有許多優(yōu)點,比如即插即用(Plug & Play)、中斷共享等。
PCI總線體系結構是一種層次式的體系結構。圖3-1是一個較為典型的PCI總線體系結構圖。從圖3-1中可以看到,PCI總線體系結構中包含以下主要的設備。

圖3-1 PCI體系結構
? PCI設備:遵循PCI規(guī)范,工作在PCI局部總線環(huán)境下的設備。典型的PCI設備是封裝在集成線路板(IC Package)中,或者集成到PCI擴展卡上的完整的外圍元件適配器。通常見到的有網(wǎng)絡、顯示或者SCSI適配器。PCI局部總線規(guī)范指出,每個PCI設備可以包含最多8個PCI功能,每個功能是一個邏輯設備。
? PCI橋設備:由于電子負載限制,每條PCI總線上可以掛載的設備數(shù)目是有限的,因此使用了一種特殊的設備,即PCI-PCI橋設備。PCI-PCI橋為兩條獨立的PCI總線提供連接。PCI-PCI橋設備也是一種廣義上的PCI設備。在本文中,PCI-PCI橋設備簡稱PCI橋。
? 主橋設備:PCI橋設備和PCI設備最終通過Host-PCI橋設備連接到CPU,使整個系統(tǒng)看起來像一顆倒置的樹狀結構,樹的頂端是CPU和內(nèi)存。由Host-PCI橋設備引出的PCI總線也稱為PCI根總線。在本文中,Host-PCI橋設備簡稱為主橋。
PCI橋所處的PCI總線稱為主總線(Primary Bus),它所連接的PCI總線稱為次總線(Secondary Bus)。主總線稱為次總線的父總線,而次總線稱為主總線的子總線。從CPU的角度來看,主總線是靠近CPU一側的總線,而次總線是遠離CPU一側的總線。主總線位于上游(Upstream),次總線位于下游(Downstream)。
此外,在PCI總線體系結構上,還有一些其他的橋接設備,例如PCI-ISA橋設備,用于連接一些低速外圍設備,由于不在研究范圍之內(nèi),這里不予以考慮。
要使得PCI設備能正常工作,CPU必須和PCI設備進行通信,也就是說它們需要有共享的地址空間。同CPU一樣,PCI設備也有自己的內(nèi)存空間和I/O空間,這些空間被映射到CPU的內(nèi)存空間和I/O空間。在映射之后,PCI設備上的物理資源“變成”了CPU的本地資源。
和某些其他總線使用手動跳線的方式進行地址空間映射相比,PCI設備的地址空間映射在操作系統(tǒng)啟動過程中自動完成。要實現(xiàn)自動映射,必須解決下面幾個問題。
? 操作系統(tǒng)如何確定PCI設備有多少地址空間需要映射?
? 操作系統(tǒng)如何通知PCI設備它在CPU地址空間的窗口?
? 橋設備如何知道要訪問的地址空間對應于它下游的PCI設備?
PCI規(guī)范為PCI設備預先定義了基地址寄存器(Basic Address Register)。操作系統(tǒng)往基地址寄存器中寫入全1,然后再回讀,就可以獲得PCI設備需要映射到地址空間的大小。操作系統(tǒng)使用特定的機制確保地址映射不能沖突,之后再將映射后的地址寫入PCI設備的基地址,PCI設備因此得知系統(tǒng)為它分配了哪一段地址空間。
同時,PCI規(guī)范為PCI橋設備定義了基地址寄存器和限制寄存器,通過向這些寄存器中寫入特定的值,安置了一個涵蓋了所有下游PCI設備地址空間的窗口范圍。PCI橋設備只將這個窗口范圍內(nèi)的PCI I/O和PCI內(nèi)存讀/寫請求向下傳遞,所有其他PCI I/O和內(nèi)存地址都會被忽略。這種過濾機制防止了地址不必要的在系統(tǒng)中傳播。
這樣,CPU在指令執(zhí)行的時候給出一個地址,這個地址首先送到主橋,主橋判斷出這個地址是落在內(nèi)存地址空間或是PCI地址空間上,如果落在PCI空間地址中,則主橋通過PCI總線仲裁申請,把地址送到PCI總線,總線上的PCI設備和PCI橋設備會根據(jù)自己的地址空間或者窗口范圍來進行如下的比較。
PCI橋設備如果在主總線上接收到地址訪問:
? 如果要尋址的地址不在自己的地址窗口內(nèi),則忽略之;
? 如果要尋址的地址落在自己的地址窗口內(nèi),則從主總線傳遞到次總線上。
PCI橋設備如果在次總線上接收到地址訪問:
? 如果要尋址的地址落在自己的地址窗口內(nèi),則忽略之;
? 如果要尋址的地址不在自己的地址窗口內(nèi),則從次總線傳遞到主總線上。
對于PCI設備:
? 如果要尋址的地址不在自己的地址空間內(nèi),則忽略之;
? 如果要尋址的地址落在自己的地址空間內(nèi),則作為PCI從設備相應,完成數(shù)據(jù)傳輸。
由此可以看到,要讓PCI設備工作,操作系統(tǒng)必須先“配置”好PCI設備(以及PCI橋設備)的一些寄存器,上面我們看到了PCI設備的基地址寄存器,以及PCI橋設備的基地址和限制寄存器,后面我們還會看到一些其他寄存器,它們一起構成了PCI設備的配置空間。
PCI設備的配置空間也稱為配置寄存器組,其中前面64個字節(jié)(16個32位寄存器)的用途和格式是標準的,被稱為配置寄存器組的“頭部”(Configuration Header)。PCI規(guī)范定義了三種類型的PCI配置空間頭部。我們這里只關注用于標準PCI設備的“類型0”(Type 0)和用于PCI -PCI橋的“類型1”(Type 1)。類型00h的配置空間頭的圖示如圖3-2所示。

圖3-2 類型00h的配置空間頭
類型0的配置空間為PCI標準設備定義,前面16個字節(jié)是各種類型的配置空間所共有的,即為配置空間的公共域。
廠商ID(Vendor ID):這個域表示了設備的制造商。廠商標識符由PCI特別興趣小組(PCI-SIG)統(tǒng)一分配,以確保唯一性。0xFFFF是一個無效值。
設備ID(Device ID):這個域表示了特定的設備。這個標識符由廠商自行分配。
廠商ID和設備ID寄存器標識PCI設備,通常被稱為PCI ID。
修正號ID(Revision ID):這個域指定了設備的修正號。這個標識符由廠商選定。0也有效。這個域應該被看作設備ID的擴充。
狀態(tài)寄存器(Status Register)被用來報告支持哪些特性,以及是否出現(xiàn)了某種錯誤。例如,狀態(tài)寄存器的位4表明PCI設備偏移34h處為指向設備能力鏈表的指針,操作系統(tǒng)從它開始查找PCI設備支持的能力。
命令寄存器(Command Register)包含了各種特性的位掩碼,這些特性可以被獨立允許或禁止。例如,在配置好PCI設備后,啟用PCI設備時,其中的工作之一就是將命令寄存器的位0和/或位1置位,分別允許PCI設備對I/O空間和/或內(nèi)存空間的訪問做出響應。又如,命令寄存器的位2控制設備作為PCI總線上的主控設備(Bus Master)的能力。值0禁止設備生成PCI訪問,值1允許設備作為總線主控設備。PCI設備要支持DMA,就必須設置這一位。
頭類型(Header Type):這個域的位7表示這個設備是否包含多個功能。如果為1,表示這個設備是多功能設備;否則為單功能設備。這個域的位6~位0表示這個設備的類型,因而確定了配置空間頭部10h字節(jié)偏移開始的布局。如果為00h,則這個設備是一般的PCI設備,如果為01h,則為PCI-PCI橋,如果為02h,則為CardBus橋,其他值保留未使用。
類型0的配置空間頭部從偏移10h開始是六個32位基地址寄存器。設備可以使用任何一個或多個基地址寄存器。64位的地址將占用兩個連續(xù)的基地址寄存器。系統(tǒng)軟件,包括BIOS和操作系統(tǒng),查找這些寄存器,看這個PCI設備是否有地址空間映射需求。如果設備需要將資源同時映射到CPU的內(nèi)存空間和I/O空間,必須使用兩個基地址寄存器。通常來說,PCI設備都會實現(xiàn)至少一個基地址寄存器,將它的資源映射到CPU的內(nèi)存空間,如圖3-3所示。
基地址寄存器的位0用來確定是否寄存器被映射到內(nèi)存或者I/O空間。它是只讀的,映射到內(nèi)存空間的基地址寄存器必須在位0返回0;映射到I/O空間的基地址寄存器必須在位0返回1,如圖3-4所示。
映射到I/O空間的基地址寄存器總是32位寬,第0位保持為1,位1被預留,在被讀取時必須返回0,而剩下的位用來映射設備到I/O空間。

圖3-3 映射到內(nèi)存空間的基地址寄存器

圖3-4 映射到I/O空間的基地址寄存器
映射到內(nèi)存空間的基地址寄存器可以是32位或64位(以支持映射到64位地址空間)寬,第0位保持為0。對于內(nèi)存基地址寄存器,位2和位1表示映射到類型。如果數(shù)據(jù)可預取,則位3設置為1;否則位3設置為0。
子系統(tǒng)廠商ID(Subsystem Vendor ID)和子系統(tǒng)設備ID(Subsystem Device ID)進一步標識這個設備。廠商ID是指芯片制造商,而子系統(tǒng)廠商ID則是PCI卡的制造商。子系統(tǒng)設備ID由子系統(tǒng)廠商分配。
中斷引腳(Interrupt Pin):中斷引腳寄存器報告設備(確切地說,是設備功能)使用哪個中斷引腳。值1對應INTA#,值2對應INTB#,值3對應INTC#,值4對應INTD#。如果不使用中斷引腳,則該域應該清零。這個寄存器是只讀的。
中斷線(Interrupt Line):中斷線寄存器給出了ISA IRQ編號。這個寄存器可讀/寫,使用了中斷引腳的設備(設備功能)都必須實現(xiàn)。在PCI設備掃描時,系統(tǒng)軟件將路由信息寫到這個寄存器,這個值被系統(tǒng)軟件和設備驅動使用,PCI設備本身并不使用它。
類型01h的配置空間頭的圖示如圖3-5所示。

圖3-5 類型01h的配置空間頭
類型1的配置空間為PCI橋設備定義,其開頭16個字節(jié)的用途和格式與類型0相同,包含著有關頭部的類型、設備的種類、特性以及制造商等信息。類型1的配置空間其他主要域如下。
主總線編號(Primary Bus Number)寄存器用來記錄橋的主接口所連接的PCI總線的編號。系統(tǒng)軟件負責填入該寄存器的值。橋使用主總線編號寄存器解碼次接口上類型1配置事務,被轉換為主接口上的事務。PCI設備必須實現(xiàn)這個寄存器為讀/寫,在系統(tǒng)復位后,這個寄存器的默認值應該為0。
次總線編號(Secondary Bus Number)寄存器用于記錄橋的次接口所連接的PCI總線的編號。系統(tǒng)軟件負責填入該寄存器的值。橋使用次總線寄存器確定是否響應主接口上的類型1配置事務,以及將配置事務轉換為次接口上的類型0配置事務。橋還使用次總線編號寄存器以及附屬總線編號寄存器確定是否將類型1的配置事務向上游轉發(fā)。PCI設備必須實現(xiàn)這個寄存器為讀/寫,在系統(tǒng)復位后,這個寄存器的默認值應該為0。
附屬總線編號(Subordinate Bus Number)寄存器用于記錄這個橋段下游PCI總線的最大編號。換句話說:對于每個PCI橋,位于它下游的PCI總線的編號都必須在它的次總線編號(含)和附屬總線編號(含)之間。系統(tǒng)軟件負責填入該寄存器的值。橋使用附屬寄存器以及次總線編號寄存器確定是否響應主接口上的類型1配置事務,以及將配置事務傳遞到次接口。橋還使用次總線編號寄存器和附屬總線編號寄存器確定是否將類型1的配置事務向上游轉發(fā)。PCI設備必須實現(xiàn)這個寄存器為讀/寫,在系統(tǒng)復位后,這個寄存器的默認值應該為0。
操作系統(tǒng)啟動過程中,必須完成所有PCI設備的配置。未成功配置的PCI設備不能正常工作。PCI設備配置需要解決下面兩個問題。
? PCI設備及其配置空間是如何尋址的呢?
? 操作系統(tǒng)如何訪問PCI設備的配置空間?
前面看到,PCI體系為層次式結構。PCI設備尋址用到了三個元素:總線編號、插槽編號和功能編號。總線編號唯一標識了PCI設備所在的PCI總線,插槽編號為PCI設備在該總線上的編號。一個物理PCI設備可能包含多個功能,每個功能對應一個邏輯PCI設備,有一個功能編號。這里的PCI設備尋址是指邏輯PCI設備。找到了PCI設備,要尋址其配置空間,只需要給出寄存器在配置空間的偏移,即寄存器編號。
由于Intel x86上沒有配置空間,我們不能像上面的內(nèi)存空間和I/O空間那樣采用“映射”的方法。實際上,操作系統(tǒng)對配置空間訪問借助了CPU的I/O空間。對于i386結構的處理器,PCI總線的設計者在I/O地址空間保留了兩個32位的寄存器,第一個是“配置地址寄存器”0xCF8(CONFIG_ ADDRESS),第二個是“配置數(shù)據(jù)寄存器”0xCFC(CONFIG_DATA)。要訪問某個設備的配置空間中某個寄存器時,CPU先往配置地址寄存器寫入目標地址,然后通過配置數(shù)據(jù)寄存器讀/寫數(shù)據(jù)。
寫入配置地址寄存器中的目標地址布局如圖3-6所示,包括總線號、設備號、插槽號、功能號,以及配置寄存器地址。

圖3-6 配置地址寄存器的布局
? 總線號8位:每個系統(tǒng)最多256條總線。
? 插槽號5位:每條總線最多32個設備。
? 功能號3位:每個設備最多8個功能。
? 寄存器地址6位:每個功能有64個32位(256字節(jié))的寄存器。
? 字節(jié)編號2位:每個(32位的)寄存器有4個字節(jié)。
配置地址空間的大小為每個功能256字節(jié)×每個插槽8個功能×每條總線32個插槽×每個系統(tǒng)256條總線。
CPU對配置地址寄存器和配置數(shù)據(jù)寄存器的訪問將被接收到的主橋轉換為配置事務發(fā)到PCI總線上。主橋首先檢查配置事務中的總線編號,如果為0,則這個配置事務是針對主橋自身或者PCI總線0上的PCI設備的,如圖3-7所示。主橋將配置事務轉換為類型0的配置事務并在總線0內(nèi)廣播。

圖3-7 類型0的PCI配置事務
類型0的配置事務根據(jù)“設備選擇(Device Select)”域選擇目標PCI設備。在收到類型0的配置事務后:
? 如果“設備選擇”選中的是本設備,則響應之;
? 如果“設備選擇”選中的不是本設備,則忽略之。
如果主橋接收到的配置事務中的總線編號大于0,則主橋將配置事務轉換為類型1的配置事務,如圖3-8所示。

圖3-8 類型1的PCI配置事務
當PCI橋看到一個類型1的配置事務的時候:
? 如果要尋址的總線編號不在橋的次總線編號和總線的附屬編號之間,忽略之;
? 如果要尋址的總線編號和橋的次總線編號符合,就把它轉變成為類型0的配置事務;
? 如果要尋址的總線編號大于次要總線編號并且小于或等于附屬總線編號,就不加改變地傳遞到次總線接口上。
從上可以看到,次總線編號和附屬總線編號一起,構成了一個過濾窗口,防止配置事務不必要地在系統(tǒng)中傳播。換句話說,次總線編號和附屬總線編號寄存器對于配置空間的訪問,與基地址和限制寄存器對于I/O空間和內(nèi)存空間的訪問起著相同的作用。
PCI子系統(tǒng)核心代碼包括體系架構相關部分以及通用部分,分別位于arch/x86/pci/以及drivers/pci兩個目錄下。PCI子系統(tǒng)的主要功能是:
1.枚舉PCI總線和PCI設備,在內(nèi)存建立可供設備驅動使用的核心結構;
2.配置PCI設備和橋設備,包括總線號、基址寄存器以及中斷線等。
3.在sysfs文件系統(tǒng)中構造PCI子系統(tǒng)的目錄樹。
- Instant Raspberry Pi Gaming
- 計算機應用
- Hadoop 2.x Administration Cookbook
- Python Data Science Essentials
- 大數(shù)據(jù)安全與隱私保護
- PostgreSQL Administration Essentials
- 西門子變頻器技術入門及實踐
- HTML5 Canvas Cookbook
- Mastering GitLab 12
- 單片機原理實用教程
- 無人駕駛感知智能
- 人工智能云平臺:原理、設計與應用
- 玩轉PowerPoint
- 巧學活用Linux
- Microsoft Office 365:Exchange Online Implementation and Migration(Second Edition)