PCIe的歷史

PCIe是在PCI(Peripheral Component Interconnect)的基礎上發展而來的。而PCI則是Intel在1992年提出的一套匯流排協議,並召集其它的小夥伴組成了名為 PCI-SIG (PCI Special Interest Group)(PCI 特殊興趣組)的企業聯盟。 這個組織就負責PCI和其繼承者們(PCI-X和PCIe的標準制定和推廣)。

PCIe 體系結構簡介

PCI的提出是為了解決當時的ISA/EISA,MCA,VLB等匯流排速度太慢,介面混亂不統一而提出的,因為它的統一和開放,PCI獲得了廠商的歡迎和支援,各種PCI裝置應運而生豐富了PC的生態。雖然PCI匯流排獲得了巨大的成功,但是隨著CPU主頻的不斷提高,PCI匯流排的頻寬越來越難以滿足要求。PCI匯流排不斷的升級從32位/33MHz擴充套件到64位/64MHz,PCI-X甚至提升到了533MHz,最大理論頻寬為4263MB。但是仍然無法解決其體系結構中存在的一些先天不足:

PCI是共享匯流排,總線上的所有裝置必須共享頻寬,另外匯流排協議還有一些開銷,雖然64位/64MHz理論上可以提供最大頻寬為532MB,但是實際可以利用的資料頻寬遠低於峰值。

PCI匯流排是並行的,它透過提高匯流排頻率和位寬的方式增加傳輸頻寬,但是這種方式的價效比比較低,因為位寬的增加需要更多的晶片管腳,從而導致64位的芯片價格遠高於32位,另外在主機板設計的時候也需要更多層的PCB實現64位晶片介面,增加成本和佈線 難度;而且因為頻率和位寬的增加帶來了訊號完整性的問題,也影響了匯流排的負載能力。比如33MHz的匯流排可以驅動10個負載,66MHz的匯流排最多隻能渡情4個負載。

PCI匯流排並沒有考慮服務質量QoS,因為PCI匯流排是並行的主從式的匯流排,總線上的裝置只能輪流使用PCI匯流排,當一個裝置長期佔用匯流排時將阻止其他裝置對匯流排的使用但是有些實時的裝置如資料採集卡,音訊或者影片的應用需要額定的頻寬,因此就沒法得0以 滿足。

PCIe如何解決PCI體系結構存在的問題的呢?

PCIe使用了高速差分匯流排端到端的連線方式替代並行匯流排,與並行匯流排相比高速差分訊號可以使用更高的時鐘頻率,而且更少的訊號線實現之前需要更多的晶片管腳才能實現的匯流排頻寬,而且與單端訊號相比差分訊號的抗干擾能力更強。

PCIe使用了網路通訊中使用的技術如基於多種資料路由方式,報文資料傳送,以及Traffic class和virtual channel結束資料傳輸過程中的QoS問題。

PCIe的鏈路可以由多條Lane組成,換句話來說它的效能可擴充套件。可以像搭積木一樣增加Lane或者減少Lane的組合來提高效能。

PCIe匯流排在系統軟體程式設計上和PCI匯流排相容,絕大多數的PCI匯流排事務都被PCIe匯流排保留,PCI裝置的配置空間也被PCIe繼承。

PCIe匯流排基礎

PCIe 從2003年的1。0版本開始到現在的6。0經歷了數次更新,速度從2。5GT/s提升到了65GT/s。

PCIe 體系結構簡介

PCIe採用了端到端的全雙工的傳輸設計,基於資料包的傳輸,裝置之間透過link相連,link支援1到32個通道(lane)。

PCIe 體系結構簡介

PCIe 體系結構簡介

每個鏈路可以包含多達32個通道。

PCIe 體系結構簡介

PCIe 採用了差分訊號對資料進行收發,以提高匯流排的效能 。 除了差分匯流排,PCIe還引入了嵌入式時鐘的技術(Embedded Clock),即傳送端不再向接收端傳送時鐘,但是接收端可以透過8b/10b,128b/130b的編碼從資料Lane中恢復出時鐘。

PCIe 體系結構簡介

PCIe匯流排的層次結構

PCIe使用序列的基於資料包的傳輸方式,這種方式有效的去除了PCI匯流排中存在的一些sideband訊號如INT#,PME#。 PCIe匯流排是分層實現的,它包含多個層次,從上到下分別是應用層(也就是下圖中的Device Core,PCIe Core HW/SW Interface),事務層(Transaction Layer),資料鏈路層(Data Link Layer),物理層(Physical Layer),其中,應用層並不是PCIe Spec所規定的內容,完全由使用者根據自己的需求進行設計,另外三層都是PCIe Spec明確規範的,並要求設計者嚴格遵循的。PCIe的層次結構有點類似TCP/IP的協議實現,不過PCIe的各個層次都是透過硬體邏輯實現的。傳送時資料報文先由應用層產生,然後經過事務層,資料鏈路層和物理層最終傳送出去。接收端則是相反的一個步驟,資料先經過物理層,然後向上送給資料鏈路層,事務層,最後到達應用層。

PCIe 體系結構簡介

PCIe 體系結構簡介

事務層

PCIe事務層定義了匯流排所使用的事務,其中大部分都與PCI匯流排相容在PCIe Spec中,規定了四種類型的請求(Request):Memory、IO、Configuration和Messages。其中,前三種都是從PCI/PCI-X匯流排中繼承過來的,第四種Messages是PCIe新增加的型別。事務層接收來自核心層的資料並將其封裝成TLP(Transaction Layer Packet)發向資料鏈路層。另外事務層也可以從資料鏈路層接收資料報文,然後轉發到核心層。

PCIe 體系結構簡介

資料鏈路層

資料鏈路層接收來自事務層的資料報文,新增Sequence Number字首和CRC字尾。資料鏈路層使用ACK/NAK協議保證報文的可靠傳遞。另外它還定義了多種DLLP(Data Link Layer Pakcet),DLLP 產生於資料鏈路層結束於資料鏈路層。DLLP於TLP並不相同,DLLP不是TLP加上Sequence Number和CRC字尾組成的。

PCIe 體系結構簡介

物理層

物理層是PCIe匯流排的最底層,將PCIe裝置相互連線在一起。它負責接收和轉發各種資料包(TLP,DLLP)。另外它還建立和解碼一些專門的序列Ordered-Set Packet或者叫做PLP(Physical Layer Packet),這些序列用於同步和管理鏈路。物理層還實現了鏈路訓練和初始化的功能,它透過LTSSM來完成(Link Training and Status State Machine)。

PCIe 體系結構簡介

PCIe 體系結構簡介

PCIe 體系結構簡介

PCIe體系的拓撲結構

PCIe作為區域性匯流排主要是用來處理器系統中的外部裝置,當然它也可以用來連線其他的處理器系統。在大多數處理器系統中都使用了RC,Switch和PCIe-PCI橋等模組用來連線PCIe和PCI裝置。

PCIe 體系結構簡介

Up/Down Stream Port

PCIe spec規定可以與RC直接或者間接相連的埠稱之為上游埠,在PCIe匯流排中,RC的位置一般在上方,這也是上游埠的由來。除上游埠之外的其它埠就是下游埠。

PCIe 體系結構簡介

Root Complex

RC是PCIe體系結構中的一個重要的組成部件,它與PCI匯流排的中Host bridge有些類似,是CPU和PCIe匯流排直接的介面。它的主要功能是完成儲存器域到PCIe匯流排域的地址轉換,隨著虛擬化技術的引入,RC的功能也越來越複雜。RC把來自CPU的request轉化成PCIe的4種不同的requests(configuration, Memory, I/O, Message)併發送給接在它下面的裝置。從軟體的角度來看,RC像是一組虛擬的PCI-PCI橋。

PCIe 體系結構簡介

PCIe Switch & Bridge

Switch提供了分散或者是聚合的功能,它允許更多的裝置接入到 一個PCIe Port。它扮演了資料包路由的功能。Bridge提供了一個轉換介面用來連線其他的匯流排,如PCI/PCI-X。這樣可以允許在PCIe的系統中接入一張舊的PCI裝置。

PCIe Endpoint

它只有一個上游埠,位於PCIe拓撲結構的樹的末端。它作為請求的發起者或者完成者。分為Legacy Endpoint和Native Endpoint,Legacy使用PCI匯流排的操作用於支援向後相容。

PCIe的軟體程式設計介面

PCIe 配置空間

PCI spec規定了256位元組的配置空間,PCIe匯流排為了相容PCI裝置,幾乎完整的保留了PCI匯流排的配置空間。並將配置空間擴充套件到了4KB,用於支援一些PCIe匯流排中的新功能,如Capability,power management, MSI等。

PCIe 體系結構簡介

PCI裝置使用Bus Device Function用來區分不同的裝置(簡稱BDF),PCIe也繼承了這種編碼方式,另外PCI定了以了兩種header的格式(配置空間內容不一致),一種是PCI device,另一種是Bridge,同樣PCIe也繼承了這種格式。

PCIe 體系結構簡介

PCI裝置使用IO空間的CF8(Configuration Address Port)/CFC(Configuration Data Port)地址來訪問配置空間。

PCIe 體系結構簡介

PCIe 體系結構簡介

PCIe將配置空間擴充套件到4KB,原來CF8/CFC的訪問方式仍然可以訪問所有PCIe配置空間的前256Byte,但是訪問不了剩下的空間。所以PCIe引入了所謂的增強配置空間訪問機制Enhanced Configuration Access Mechanism,它透過將配置空間對映到MMIO空間,使得對配置空間的訪問就像對記憶體一樣,也因此可以訪問完整的4KB配置空間。

PCIe 體系結構簡介

PCIe的列舉

PCI列舉的過程其實是一個使用深度優先的演算法不斷遞迴發現新裝置的過程,以下圖為例主要包含以下步驟。

從RC開始,尋找裝置和橋,發現橋以後設定下一級Bus,繼續遞迴發現下一級PCI裝置子樹。

先從Bridge A開始,嘗試讀取配置空間的Vendor ID,看看裝置是否存在而且只是有一個Function。如果不存在就繼續嘗試Device1-31 Function 0。

下圖的情況A的header type是01h表明這是一個Bridge,Multifunction Bit7是0表示這是一個single function。

設定Bridge A 的 Primary Bus Number Register = 0 Secondary Bus Number Register = 1 Subordinate Bus Number Register = 255。這樣接在這個bridge下面的匯流排是bus1,最大的匯流排是255。

繼續深度優先搜尋,在探索bus0上的其它裝置之前,我們先要去探索bus1上的裝置樹。

讀取B1D0F0 Vendor ID和Header Type也就是下圖的C,我們同樣也能知道它是一個Bridge而且是單功能的。

設定Bridge C的配置空間Primary Bus Number Register = 1 Secondary Bus Number Register = 2 Subordinate Bus Number Register = 255。

嘗試讀取B2D0F0的Vendor ID也就是下圖的D,同樣我們可以知道它是一個單功能的橋裝置。

設定D的配置空間的暫存器Primary Bus Number Register = 2 Secondary Bus Number Register = 2 Subordinate Bus Number Register = 255。

讀取B3D0F0的Vendor Id和Header Type進而確認 它是一個裝置而且是多Function。

嘗試遍歷所有的8個Function,可以發現一共存在2個Function 而且都是Endpoint。

繼續嘗試遍歷bus3下面的所有的Device1-31,這次應該沒有發現任何其他的Function。

更新Bridge D真正的Subordinate Bus Number Register = 3,然後回到上一級(bus2)繼續遍歷虛招有效的Function,在下圖的例子中我們會找到Bridge E B2D1F0。

同樣讀取Vendor ID和Header Type表面 E是一個單功能的橋裝置。

設定E的 Primary Bus Number Register = 2 Secondary Bus Number Register = 4 Subordinate Bus Number Register = 255。

繼續深度優先遍歷讀取B4D0F0的Vendor ID以及Header Type,表明它是一個單功能的裝置。

嘗試遍歷bus4 device 1-31,下圖中找不到其他的功能裝置。

這時已經到了樹的底部,接下來更新上層Bridge E的Subordinate Bus Number Register = 4。然後回到上一級匯流排bus2,嘗試讀取device2-31,因為下圖沒有實現,所以在bus2上找不到其他的裝置。

更新上一級匯流排也就是C的真正的Subordinate Bus Number Register = 4,然後嘗試讀取Device1-31的其它Function,因為沒有實現,所以找不到其它的Function。

繼續向上更新bus1的上一級Bridge也就是A,它的真正的Subordinate Bus Number Register = 4,回朔到上一級匯流排Bus0,繼續讀取下一個裝置B0D1F0(也就是B)的Vendor ID和Header Type,接下來的就是重複A的過程。

PCIe 體系結構簡介

除了配置bus,列舉過程中還會透過讀取bar記錄所有MMIO和IO的需求情況,然後設定對應的bar以及必要的Capabilities。

Refer:

1。 PCI Express Technology 3。0

2。 PCI-SIG – PCI Special Interest Group

3。 PCIe掃盲系列博文