當前位置:編程學習大全網 - 編程語言 - PCIE 總線協議(轉)

PCIE 總線協議(轉)

最近在學習 PCIE 總線協議,本人作為壹個剛開始的小白,打算寫寫筆記加深下自己的理解。如果妳也是剛開始入門的朋友,希望能妳有所幫助。水平有限,如有錯誤,望批評指正。本人看的書主要有兩本,壹本是《PCI Express 系統結構標準教材》,《pci express system architecture》的中文版,還有壹本是《深入淺出SSD》,由SSD技術社區SSDFan核心成員撰寫,後者對於初學者而言更為友好壹點。

概述

PCIe是從PCI發展過來的,“e” 是 “express”的簡稱,是“快”的意思,PCI使用並口數據傳輸,PCIe使用串口傳輸,但是PCIe的速度更快。並口傳輸每次可以傳送多位數據,但是為何比串口慢?這便要考慮並行總線的時鐘頻率問題。

在低頻情況下,並口傳輸確實比串口要快。在對傳輸速度不斷提升的同時,時鐘頻率也需要不斷提高,並口傳輸便會有壹些問題。

如上圖所示,在發送端,公***時鐘第壹個上升沿到來時,將多位數據發送出去。數據通過傳輸介質到達接收端,接收端在公***時鐘第二個上升沿對數據進行采集。接收端需要接收正確的數據,就必須要保證數據在傳輸介質中的傳輸時間小於公***時鐘周期,傳輸時間還隨數據線長度增大而增大。受限制於傳輸時間,時鐘頻率無法做的很高。並且由於並行傳輸,每位數據到達接收端的時間都不相同,存在相位偏移,必須要等到最慢的那個bit數據到達,才可以進行采集。

PCIe使用串行傳輸便能避免上述問題,由於是壹位壹位的傳輸,不存在相位偏移。它的時鐘信息通過8/10編碼或者128/130編碼(這個後面會說)嵌入在數據流中,接收端可以從數據流中恢復時鐘信息。但是如果使用多條串行通道並行傳輸,便又會存在上述問題,PCIe有相應機制解決好這個問題。

PCIe速度

兩個PCIe設備之間的連接,稱為壹個 Link,壹個Link有兩個方向,壹邊發送,壹邊接收,可以同時進行,這種通信方式稱為全雙工。每個方向上可以有 1~32個lane並行,每個lane 代表壹對串行通道。

8/10編碼 :在串行通道上傳輸時,將 8bits數據編碼為10bits數據,做壹個轉換,使各位數據之間有更多的 1到0 和 0到1 的跳變,以便接收設備檢測這些跳變,能更容易地恢復時鐘。128/130編碼的原因也是類似的。

這樣,在串行通道上傳輸10位數據,實際上只傳輸了8位。

對於 PCIe1.0線上bit傳輸速率為 2.5 Gbps(2.5 Gigabit per second),使用8/10編碼:

PCIe1.0 的帶寬為: 2.5Gbps * 2(兩個方向) * 8/10 = 0.5GB/s(Gigabyte per second)

對於 PCIe2.0線上bit傳輸速率為 5 Gbps(5 Gigabit per second),使用8/10編碼:

PCIe1.0 的帶寬為: 5Gbps * 2(兩個方向) * 8/10 = 1GB/s(Gigabyte per second)

對於 PCIe3.0線上bit傳輸速率為 8 Gbps(8 Gigabit per second),使用128/130編碼:

PCIe1.0 的帶寬為: 8Gbps * 2(兩個方向) * 128/130 ≈ 2GB/s(Gigabyte per second)

上表中列出三代 PCIe的帶寬,其中“x1” “x2” “x4”等代表的是Link中的 lane 數目。

PCIe拓撲結構

基於PCIe的計算機系統如圖所示,

CPU平時非常的忙,便把很多事交給根聚合體(Root Complex 簡稱RC)來幹,RC可以訪問內存,通過內部PCIe總線以及若幹個PCIe Bridge,擴展出若幹個其他的PCIe端口, RC內部十分復雜。

PCIe終端設備稱為 Endpoint,比如 PCIe SSD,PCIe 網卡等等,Endpoint可以掛載到 RC 上,也可以掛載到Switch上。

switch(交換器)擴展了PCIe端口,將壹個PCIe端口擴展為若幹個,靠近RC的端口稱為上遊端口,擴展出來的端口稱為下遊端口。下遊端口可以掛載其他switch或者Endpoint,並且對他們進行管理。從上遊過來的數據,它需要鑒定:1.否是是傳給自己的數據,如果是便接收。2. 是不是自己下遊端口的數據,如果是便轉發 3.如果都不是,便拒絕。從下遊端口掛載的Endpoint傳給RC的數據,switch也會檢查並轉發。

每個數據身上都有自己的目的地信息,switch識別信息並壹層壹層地傳送到目的地,稱為路由(我個人的理解)。

路由的方式有三種:地址路由,ID路由和隱式路由(後面會說到)。

對於switch多個下遊端口上的 Endpoint(例如圖中的EP1和EP2) 同時向RC發送數據,switch中會有相應的仲裁機制(後面會說到),確定數據的優先級,將優先級高的數據傳送到上遊端口中去。

switch結構如上圖所示,其內部有壹條總線和多個PCI-PCI Bridge,用來實現端口的擴展。如果要switch實現上述的管理功能,就需要對每個 Bridge進行壹些配置。各個 Bridge 都要實現 “配置頭1寄存器”,即Bridge裏面有很多寄存器,對這些寄存器進行配置,就可以讓switch實現相應的功能(後面會說到)。

其他:對於PCIe 系統中的壹次 事務 (事務定義為請求者和完成者之間完成壹次信息傳送,需要完成的壹系列壹個或多個數據包傳送的過程),由請求者發起,完成者接收數據並完成相應的事情。

請求者是能夠在PCIe中發起事務的設備。根聚合體RC和Endpoint是請求者類型。

完成者是請求者尋址或者說作為目標的設備。請求者讀取完成者的數據或者是請求者將數據寫入完成者,根聚合體RC和Endpoint也是完成者類型。

PCIe事務簡介

PCIe 運用數據包實現設備之間的數據傳輸,根聚合體RC可以和各種Endpoint通信,理論上任何兩個Endpoint都可以直接通信,但實際上很少這樣做,因為兩個不同設備的數據格式不?樣,除?這兩個設備是同?個?商的。通常都是Endpoint與RC通信,或者Endpoint通過RC與另外?個Endpoint通信。

通信涉及壹種稱為處理層數據包(Transaction Layer packet,? TLP )的數據包發送和接收。

PCIe的事務分為4大類:

存儲器事務

IO事務

配置事務

消息事務

上表為PCIe事務種類,其中Memory Read Lock是歷史遺留物,為的是兼容老設備,我們可以忽略。其余的種類下面會介紹。

事務又可以分為報告事務(Posted)和非報告事務(Non-Posted)。

對於非報告事務而言,請求者發送壹個TLP請求數據包給完成者,稍後,完成者返回壹個TLP完成數據包給請求者,表示完成者已經成功收到了請求TLP數據包。非報告事務被作為 分離事務處理 (下面會說)。對於Read 請求,完成者需要將讀出的數據放進TLP完成數據包,發送給請求者。對於 Write 請求,完成者通過發送TLP完成數據包,告訴請求者執行的狀態,這種情況下TLP完成數據包中沒有數據。

對於報告事務而言,請求者發送壹個TLP請求數據包給完成者,完成者不返回壹個TLP完成數據包給請求者,即請求者並不知道完成者收到了沒有以及執行的怎麽樣。為的是獲取最佳性能。報告事務TLP中可以帶數據也可以不帶數據。

下圖為PCI-X分離事務模型,PCIe與之類似

請求者告訴完成者需要在它那讀點數據。

完成者說現在不能馬上給妳。

完成者先把請求者的電話、地址啥的保存壹下。

完成者發出分離響應,讓請求者把總線騰出來,給別人用用。請求者開始等待。

完成者數據準備完畢,申請使用總線,在壹段時間內將數據發送給請求者。

上圖為各個數據包類型及英文縮寫,對於配置讀/寫 (configuration Read/Write) 和消息 (Message) 事務,後面會再介紹。

事務協議

非報告讀事務

對於非報告讀事務,請求者發送TLP請求數據包給完成者,完成者收到數據包並進行解析數據包,將需要的數據放入TLP完成數據包,返回給請求者。完成者可以在每個CpID中返回最多 4KB的數據。

TLP請求數據包類型如上圖所示,請求者可以是根聚合體RC或者 Endpoint(但是Endpoint 不能發起配置讀/寫請求)。完成者可以是根聚合體RC、switch、Bridge或者 Endpoint。

請求者利用完成數據包中的壹個標記字段和它之前發送的具有相同標記值的請求數據包關聯起來,這使得請求者可以管理多個未完成的事務。

上圖中傳輸通道是壹種抽象,實際的傳輸可能需要多個switch轉發數據包,TLP請求數據包和TLP完成數據包中都有自己的目的地信息,這便又涉及到路由的問題。

如果由於錯誤,完成者不能獲得請求的數據,則它返回壹個沒有數據的完成數據包(Cpl)和壹個錯誤狀況指示。請求者在軟件層確定如何處理錯誤。

非報告寫事務

非報告寫事務種類如上圖所示,請求者將數據寫入完成者。

請求者發送帶數據的TLP寫請求數據包,完成者接收並解析數據包,並向請求者發送不帶數據的完成數據包,完成數據包包含正常完成和出現錯誤的兩種情況的信息,如果出現錯誤,請求者確定如何在軟件層處理錯誤。

請求者可以是根聚合體RC或者 Endpoint(但是Endpoint 不能發起配置讀/寫請求)。

上圖中傳輸通道也是壹種抽象,涉及路由的問題

報告存儲器寫事務

如圖所示,存儲器寫事務是報告事務。

請求者發送帶數據的寫請求數據包,完成者不返回完成數據包,而是告訴請求者寫請求數據包已成功到達目的地。這就意味著請求者並不知道是否出錯。由於沒有返回完成數據包,節約了時間,所以報告事務同非報告事務相比性能更高。

如果完成者接收的寫請求錯誤或者由於內部錯誤,無法將數據寫入目的地,便無法通過硬件協議告知請求者。完成者可能記錄錯誤並生成錯誤消息通知到根聚合體RC。由軟件處理該錯誤。

同樣有路由的問題

報告消息事務

消息事務也是報告的,分為帶數據和不帶數據兩種

消息事務可以是請求者發送到完成者,也可以是根聚合體RC到所有 Endpoint的廣播,還有是Endpoint發送給根聚合體RC。

完成者接收消息中的數據,或者完成消息指定的任務。

同樣有路由的問題

壹個事務例子

由CPU發起的非報告讀存儲器,目標是 Endpoint。

switch在上遊端口接收到數據包,傳送給哪個下遊端口,便是路由的問題,數據包中有相應的目的地信息,switch可以識別並完成轉發,這些事情在後續筆記中介紹。

  • 上一篇:昌平電腦培訓如何分享java編程抽象技術
  • 下一篇:怎麽用C語言編寫菜單?
  • copyright 2024編程學習大全網