微吼云上線多路互動直播服務 加速多場景互動直播落地
2259
2025-03-31
目錄
文章目錄
目錄
PCI 與 PCIe 設備
PCI 與 PCI-E 總線
PCIe 設備的枚舉過程
PCIe 設備的信息查詢
PCIe 設備的 Memory 空間訪問
參考文章
PCI 與 PCIe 設備
PCI(Peripheral Component Interconnect,外設組件互連):符合 PCI 總線標準的設備就被稱為 PCI 設備,PCI 總線架構中可以包含多個 PCI 設備。
PCIe(Peripheral Component Interconnect Express,快速外設組件互連):PCI Express,簡稱 PCIe,是電腦總線 PCI 的一種,它沿用了現有的 PCI 編程概念及通訊標準,但建基于更快的串行通信系統。是 Intel 提出的新一代的總線接口,PCI Express 采用了目前業內流行的點對點串行連接,比起 PCI 以及更早期的計算機總線的共享并行架構每個 PCIe 設備都有自己的專用連接,不需要向整個總線請求帶寬,而且可以把數據傳輸率提高到一個很高的頻率,達到 PCI 所不能提供的高帶寬。
如上圖,PCI 插槽都是等長的,防呆口位置靠上,大部分都是純白色。PCIe 插槽大大小小,最小的 x1,最大的 x16,防呆口靠下。
PCI 與 PCI-E 總線
PCI(Peripheral Component Interconnect,外設部件互連標準):是一種同步且獨立于 CPU 的 32 位或 64 位并行局部總線,工作頻率為 33MHz,具有即插即用(Plug and Play,P&P)功能。PCI 總線由 ISA 總線發展而來并取代了 ISA,是目前微機中使用最為廣泛的接口,幾乎所有的主板產品上都帶有 PCI 插槽。PCI 總線連接的高速 I/O 接口的設備,稱為 PCI 設備,主要為顯卡、網卡、聲卡、SCSI 卡。
從結構上看,PCI 總線是在系統總線之間插入的一級總線,具體由一個橋接電路(e.g. 南橋)實現了對這一層級的管理,這個橋接電路作為 PCI 總線控制器,含有集中式的總線仲裁器,還實現了上下層級之間的接口來協調數據的傳送。
PCI-E(PCI-Express):是一種通用的總線規格,最終的設計目的是為了取代現有電腦系統內部的總線傳輸接口,這不只包括顯示接口,還囊括了 CPU、PCI、HDD、Network 等多種應用接口,繼而解決系統內部數據傳輸的瓶頸問題。
PCI 總線屬于共享并行互聯結構,系統的各種設備共用一個帶寬,,這極大影響了系統的整體性能,而且并行通信的串擾問題也嚴重制約了日后速度的進一步提升。而 PCI-E 總線則采用了串行互聯的方式,以點對點的形式進行數據傳輸,也就是說每個設備都有自己的專用連接,可以獨享帶寬,而不必向共享總線請求帶寬。一個標準的 PCI-E 連接可以包含多個信道(Lane),當需要增加數據傳輸帶寬時,可以通過增加信道的數量來達到目的。單個信道的 PCI-E 可以提供單向 250MB/s 的帶寬,PCI-E * 16 信道則可以提供 4GB/s 的帶寬。PCI-E 相對于 PCI 大大的提高了傳輸速率,而且也為更高的頻率提升創造了條件。
PCI-E 支持對 PCI 和 PCI-X 的軟件兼容,但主板上得到接口插槽卻不兼容,因為 PCI-E 是串行接口,針數會更少,插槽會更短,PCI-E 插槽的長度跟信道的數目有關。
PCIe 設備的枚舉過程
作為 x86 體系重要的一環,PCIe 標準歷經了 PCI,PCI-X 和 PCIe,走過了近 30 年時光。下圖是一個 PCIe 的拓撲結構示意,PCIe 協議支持 256 個 Bus,每條 Bus 最多支持 32 個 Device,每個 Device 最多支持 8 個 Function,所以由 BDF(Bus,Device,Function)構成了每個 PCIe 設備節點的身份證號。
PCIe 體系架構一般由 root complex,switch,endpoint 等類型的 PCIe 設備組成。在 root complex 和 switch 中通常會有一些 embeded endpoint(這種設備不對外暴露 PCIe 接口)。這么多的設備,CPU 啟動后要怎么去找到并認出它們呢?
Host 對 PCIe 設備掃描是采用了深度優先算法,本質是一種遍歷算法,對每一個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。我們一般稱這個過程為 PCIe 設備枚舉。枚舉過程中 Host 通過配置讀事物包來獲取下游設備的信息,通過配置寫事物包對下游設備進行設置。
第一步,PCI Host 主橋掃描 Bus 0 上的設備(在一個處理器系統中,一般將 root complex 中與 Host Bridge 相連接的 PCI 總線命名為 PCI Bus 0),系統首先會忽略 Bus 0 上的 embedded EP 等不會掛接 PCI 橋的設備,主橋發現 Bridge 1 后,將 Bridge1 下面的 PCI Bus 定為 Bus 1,系統將初始化 Bridge 1 的配置空間,并將該橋的 Primary Bus Number 和 Secondary Bus Number 寄存器分別設置成 0 和 1,以表明 Bridge1 的上游總線是 0,下游總線是 1,由于還無法確定 Bridge1 下掛載設備的具體情況,系統先暫時將 Subordinate Bus Number 設為 0xFF。
第二步,系統開始掃描 Bus 1,將會發現 Bridge 3,并發現這是一個 switch 設備。系統將 Bridge 3 下面的 PCI Bus 定為 Bus 2,并將該橋的 Primary Bus Number 和 Secondary Bus Number 寄存器分別設置成 1 和 2,和上一步一樣暫時把 Bridge 3 的 Subordinate Bus Number 設為 0xFF。
第三步,系統繼續掃描 Bus 2,將會發現 Bridge 4。繼續掃描,系統會發現 Bridge 下面掛載的 NVMe SSD 設備,系統將 Bridge 4 下面的 PCI Bus 定為 Bus 3,并將該橋的 Primary Bus Number 和 Secondary Bus Number 寄存器分別設置成 2 和 3,因為 Bus3 下面掛的是端點設備(葉子節點),下面不會再有下游總線了,因此 Bridge 4 的 Subordinate Bus Number 的值可以確定為 3。
第四步,完成 Bus 3 的掃描后,系統返回到 Bus 2 繼續掃描,會發現 Bridge 5。繼續掃描,系統會發現下面掛載的 NIC 設備,系統將 Bridge 5 下面的 PCI Bus 設置為 Bus 4,并將該橋的 Primary Bus Number 和 Secondary Bus Number 寄存器分別設置成 2 和 4,因為 NIC 同樣是端點設備,Bridge 5 的 Subordinate Bus Number 的值可以確定為 4。
第五步,除了 Bridge 4 和 Bridge 5 以外,Bus2 下面沒有其他設備了,因此返回到 Bridge 3,Bus 4 是找到的掛載在這個 Bridge 下的最后一個 Bus 號,因此將 Bridge 3 的 Subordinate Bus Number 設置為 4。Bridge 3 的下游設備都已經掃描完畢,繼續向上返回到 Bridge 1,同樣將 Bridge 1 的 Subordinate Bus Number 設置為 4。
第六步,系統返回到 Bus0 繼續掃描,會發現 Bridge 2,系統將 Bridge 2 下面的 PCI Bus 定為 Bus 5。并將 Bridge 2 的 Primary Bus Number 和 Secondary Bus Number 寄存器分別設置成 0 和 5, Graphics card 也是端點設備,因此 Bridge 2 的 Subordinate Bus Number 的值可以確定為 5。
至此,掛在 PCIe 總線上的所有設備都被掃描到,枚舉過程結束,Host 通過這一過程獲得了一個完整的 PCIe 設備拓撲結構。
PCIe 設備的信息查詢
系統上電以后,Host 會自動完成上述的設備枚舉過程。除一些專有系統外,普通系統只會在開機階段進行進行設備的掃描,啟動成功后(枚舉過程結束),即使插入一個 PCIe 設備,系統也不會再去識別它。
在 Linux 操作系統中,我們可以通過 lspci –v -t 命令來查詢系統上電階段掃描到的 PCIe 設備,執行結果會以一個樹的形式列出系統中所有的 PCIe 設備。如下圖所示:
其中黃色方框中的 PCIe 設備是 Bejing Starblaze Technology Co., LTD. 推出的 STAR1000 系列 NVMe SSD 主控芯片,圖中顯示的 9d32 是 Starblaze 在 PCI-SIG 組織的注冊碼,1000 是設備系列號。
STAR1000 設備的 BDF 也可以從上圖中找出,其中 bus 是 0x3C,device 是 0x00,function 是 0x0,BDF 表示為 3C:00.0,與之對應的上游端口是 00:1d.0。
我們可以通過 lspci –xxx –s 3C:00.0 命令來列出該設備的 PCIe 詳細信息。這些內容存儲在 PCIe 配置空間,它們描述的是 PCIe 本身的特性。如下圖所示:
可以看到這是一個非易失性存儲控制器,0x00 起始地址是 PCIe 的 Vendor ID 和 Device ID。Class code 0x010802 表示這是一個 NVMe 存儲設備。0x40 是第一組 Capability 的指針,如果你需要查看 PCIe 的特性,就需要從這個位置開始去查詢,在每組特征的頭字段都會給出下一組特性的起始地址。從 0x40 地址開始依次是 Power management、MSI 中斷、鏈路控制與狀態、MSI-X 中斷等特性組。這兒特別列出了鏈路特征中的一個 0x43 字段,表示 STAR1000 設備是一個 x4lane 的鏈接,支持 PCIe Gen3 速率(8Gbps)。
當然也可以使用 lspci –vvv –s 3C:00.0 命令來查看設備特性,初學者看到下面的列表也就一目了然了。
Host 在枚舉設備的同時也會對設備進行配置,每個 PCIe 設備都會指定一段 CPU memory 訪問空間,從上面的圖中我們可以看到這個設備支持兩段訪問空間,一段的大小是 1M byte,另一段的大小是 256K byte,系統會分別指定它們的基地址。基地址配置完成以后,Host 就可以通過地址來對 PCIe memory 空間進行訪問了。
PCIe 設備的 Memory 空間訪問
PCIe Memory 空間關聯的是 PCIe 設備的物理功能(PF),對于 STAR1000 系列芯片而言,物理功能是 NVMe,memory 中存放的是 NMVe 的控制與狀態信息,對于 NMVe 的控制以及工作狀態的獲取,都需要通過 memory 訪問來實現。
下面以 NVMe 命令下發為例簡單描述 PCIe 設備的 memory 訪問。NVMe 命令下發的基本操作是:
Host 寫 doorbell 寄存器,此時使用 PCIe memory 寫請求。如下圖所示,Host 發出一個 memory write(MWr) 請求,該請求經過 switch 到達要訪問的 NVMe SSD 設備。
NVMe 讀取命令操作,這個請求會被端點設備接收并執行。如下圖所示,此時 NVMe SSD 作為請求者,發出一個 memory read(MRd) 請求,該請求經過 switch 到達 Host,Host 作為完成者會返回一個完成事物包(CplD),將訪問結果返回給 NVMe SSD。
這樣,一個 NVMe 的命令下發過程就完成了。同樣,NVMe 的其他操作比如各種隊列操作,命令與完成,數據傳輸都是通過 PCIe memory 訪問的方式進行的,此處不再詳述。
參考文章
https://mp.weixin.qq.com/s/FlRc2q8r0fUOzxJFWulGfw
單片機
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。