PCIe 介紹

PCIe 的全名為 Peripheral Component Interconnect Express。

 

 

PCIe 的頻寬

PCIe 的規範主要是為了提升電腦內部所有匯流排的速度,因此頻寬有多種不同規格標準,其中 PCIe ×16 是特別為顯示卡所設計。

傳輸通道數 腳Pin總數 主介面區Pin數 總長度 主介面區長度
x1 36 14 25 mm 7.65 mm
x4 64 42 39 mm 21.65 mm
x8 98 76 56 mm 38.65 mm
x16 164 142 89 mm 71.65 mm

 

 

PCI-E bus 的速度限制

PCI Express 1.1
使用兩對低電壓的差位訊號排線(low-voltage differential signaling pairs),分別各跑 2.5GBit/s 速度,x1 有兩對(傳送與接收) 2.5 G x 2 = 5Gbps 的頻寬,不過在討論頻寬時還是以單方向來計算。

    x1 2.5Gbps (20% overhead – PCI-e 在每八個位元的資料串上用十位元來加以編碼) 2Gbps (250 MB/sec)
    x4 10Gbps 8Gbps (1 GB/sec)
    x8 20Gbps 16Gbps (2GB/sec)
    x16 40Gbps 32Gbps (4GB/sec)

 

PCI Express 2.0
PCI-SIG 的 PCI Express 2.0 規格,新版每條 Lane 的單向頻寬從 2.5Gbps 倍增到 5Gbps。

    x1 5Gbps (20% overhead – PCI-e 並且在每八個位元的資料串上用十位元來加以編碼) 4Gbps (500 MB/sec)
    x4 20Gbps 16Gbps (2 GB/sec)
    x8 40Gbps 32Gbps (4 GB/sec)
    x16 80Gbps 64Gbps (8 GB/sec)

 

PCI Express 3.0
PCI-SIG 的 PCI Express 3.0 規格,新版每條 Lane 的單向頻寬增到 8Gbps。
但因為編碼方式改變了,相較於 2.0 之前採用 8b/10b (每10個bit只有8個是有效資料)而 3.0 編碼方式為 128/130,所以資料傳輸頻寬以及原始傳輸率基本當都可以算成 8Gbps。

    x1 8Gbps (1GB/sec)
    x4 32Gbps (4 GB/sec)
    x8 64Gbps (8 GB/sec)
    x16 128Gbps (16 GB/sec)

 

PCI Express 4.0

    x1 16Gbps (2GB/sec)
    x4 64Gbps (8 GB/sec)
    x8 128Gbps (16 GB/sec)
    x16 256Gbps (32 GB/sec)

 

PCI Express 5.0

    x1 32/25 Gbps (4/3.1 GB/sec)
    x4 128/100 Gbps (16/12.5 GB/sec)
    x8 256/200 Gbps (32/25 GB/sec)
    x16 512/400 Gbps (64/50 GB/sec)

 

 

 

lspci 指令的解析

在 Linux 下,使用 #lspci 就可以看到目前系統所有的 PCI 裝置:
# lspci
  06:00.0 Fibre Channel: QLogic Corp. ISP2432-based 4Gb Fibre Channel to PCI Express HBA (rev 03)
  06:00.1 Fibre Channel: QLogic Corp. ISP2432-based 4Gb Fibre Channel to PCI Express HBA (rev 03)

在 PCI 的裝置使用三個編號用來當作識別值,分別為 1. "匯流排(bus number)", 2. "裝置(device number) 以及 3. "功能(function number)"。
以 06:00.0 來看,就是 bus number = 06,device number = 00,function number = 0

這 3 個編號會組合成一個 16-bits 的識別碼。

匯流排(bus number) 8bits 2^8 至多可連接 256 個匯流排(0 to ff),
裝置(device number) 5bits 2^5 至多可接 32 種裝置(0 to 1f),
功能(function number) 3bits 2^3 至多每種裝置可有 8 項功能(0 to 7)。


接下來透過指令 #lspci -s 06:00.0 -vvv | grep -i width 就可以得知 PCI-Express 的速度了:

# lspci -s 06:00.0 -vvv |grep -i width
LnkCap: Port #0, Speed 2.5GT/s, Width x4, ASPM L0s, Latency L0 <4us, L1 unlimited
LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
LnkCap: Port #0, Speed 2.5GT/s, Width x4, ASPM L0s, Latency L0 <4us, L1 unlimited
LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-

LnkCap :
    系統能提供的最高頻寬 PCI-Express 1.0 ( 2.5G ) Width x4=10G。 如果系統是提供 PCI-Express 2.0 那 x1 速度就會是 5G。

LnkSta :
    目前該 PCI-E 裝置跑的速度 PCI-Express 1.0 ( 2.5G ) Width x1=2.5G。

LnkSta 和 LnkCap 這兩個速度有可能不一樣,例如,系統所提供的是 PCI Express 是 2.0,但裝置還是使用 1.0。

在 Linux 中,使用 Class ID + Vendor ID + Device ID 來代表 PCI 裝置
# lspci -n
  06:00.0 0c04: 1077:2432 (rev 03)
  06:00.1 0c04: 1077:2432 (rev 03)

使用參數 -n,使得 PCI vendor 以及 device codes 以數字來顯示。
0c04: 1077:2432 所代表裝置名稱為 Class ID = 0c04,Vendor ID = 1077,Device ID = 2432。

0c04 : class 0c04 表示是 Fiber Channel controller
1077 : vendor ID 1077 製造廠商 Qlogic Corp
2432 : device ID 2432 產品名稱 ISP2432-based 4Gb Fiber Channel to PCI Express HBA

而 ID number 與 文字之間的對應關係,可以在 pci.ids 檔案中看到。
在 Ubuntu 20.04.4 LTS 的版本中,pci.ids 的檔案路徑為: /usr/share/misc/pci.ids

針對單一裝置來檢視可以使用 -d [vendor]:[device],剛剛使用 -n 時所查到的 PCI vendor 以及 device codes 這邊就派得上用場了。

接下來透過指令 #lspci -n -d 1077:2432 -vvv | grep -i width 就可以得知 PCI-Express 的速度了.

# lspci -n -d 1077:2432 -vvv |grep -i width
  LnkCap: Port #0, Speed 2.5GT/s, Width x4, ASPM L0s, Latency L0 <4us, L1 unlimited
  LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
  LnkCap: Port #0, Speed 2.5GT/s, Width x4, ASPM L0s, Latency L0 <4us, L1 unlimited
  LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-

 

如果 PCIe 裝置有支援熱插拔,或是有沒偵測到裝置的情況,可以手動觸發 PCI rescan:
echo 1 > /sys/bus/pci/rescan
再以 lspci 指令查看系統上目前所認到的 PCIe 裝置。

 

 

 

M.2 簡介

M.2 原先被稱為 NGFF (Next Generation Form Factor,字面意義為次世代硬體規範)。
而 NGFF 於其原生定義中,廣泛涵蓋了 PCIe、SATA 以及 USB 等硬體介面之各類裝置。
亦即,一件原本為標準 PCIe 或 SATA 或 USB 介面之裝置,可依循 NGFF 之外型尺寸規範及腳位定義,來加以重行設計,以此化身為一 M.2 型式之同款裝置。

m.2_interface

此外,考量到 PCIe/SATA/USB 等不同介面之裝置,各自之腳位訊號與電氣特性皆存在著極大差異。
M.2/NGFF 為此定義了多組的插槽防呆位置 (或稱防呆鍵位,目前存在於實體產品之型式計有 A/B/E/M key),來避免不同硬體介面裝置因位腳座尺寸相近,而產生混插或誤插之情事,最後導致不正常運作或損壞之困擾。

m.2_keying

image

由於原有 PCIe、SATA 或 USB 之裝置皆可以轉設計為 M.2 之型式,以此 M.2 其並非專屬於 SSD 之格式規範。
其他諸如 Wi-Fi/Bluetooth、GPS 或 NFC 介面卡等,目前皆已有 M.2 格式之產品。

而這些裝置原先多屬於 USB 介面,若依循 M.2/NGFF 之設計規範,其金手指防呆鍵位與 M.2 SSD 將會有著顯著之不同(其它裝置主要採用 A/E key)。
整體而言,不同的金手指防呆位置,可讓消費者於安裝使用 M.2 裝置時,可獲得最低程度之依循法則。


M.2 SSD 之兩種主要插槽類型:B key 及 M key
目前普及在市的各類 3C 產品中,支援 M.2 SSD 之插槽共計有兩種類型:B key (另稱 socket 2) 以及 M key (另稱 socket 3)。

M.2 SSD 之兩種主要腳位型式:B+M key 及 M key
對應以上插槽之 M.2 SSD,其腳位並非一個蘿蔔一個坑的 B key 與 M key,而是具有兩個防呆缺口的 B+M key 型式,以及僅有一個缺口的 M key 型式。
對於 B key 插槽而言,B+M key 之 SSD 可以順利插入,而 M key 腳位之 SSD 則無法順利安裝。
B_key

同理,對於 M key 插槽而言,B+M key 之 SSD 可以順利插入,而 B key 腳位之 SSD 則無法順利安裝。
M_key

但是並非腳座相契合必然能夠相容運作,造成 M.2 SSD 無法正常運作之第一層原因,在於「硬體介面」之不同。
上文已說明了 M.2 可以涵蓋原本 PCIe、SATA 或 USB 之裝置,而 SSD 原本採用硬體介面的不同 (PCIe 或 SATA),形成了 M.2 SSD 安裝後無法相容運作之主因。

在主板端的 PCIe 插槽類型,分成三種 Socket:
    Socket 1: 主要針對無線網卡,對應的防呆鍵位為 A Key。
    Socket 2: 可以支援走 SATA 及 PCIe x2 通道的 M.2 SSD,所對應的鍵位為 B Key。
    Socket 3: 則支援走 PCIe x4 通道的 M.2 SSD,對應的鍵位為 M Key。

市面上有些 M.2 SSD 產品為了能同時相容於兩種插槽,便把金手指的部分設計成 B+M Key 的形式,但是能夠插得進去,不代表就能夠正常使用。
因為某些主機板上的 M.2 插槽僅能支援 PCIe 通道,如果你插入 SATA 的 M.2 SSD,那麼就會無法偵測到,除非廠商在設計時,就已經加入 SATA 及 PCIe 的控制器,使它能夠相容於兩者,這部分各家不一,只能從主機板規格表上自行查詢。
另外,如果是走 SATA 通道的 M.2 SSD,那麼一樣會受到 6Gb/s 頻寬的限制,在傳輸效能上等同於2.5吋的 SATA SSD。


各種類型的 M.2 裝置使用「WWLL-HH-K-K」或「WWLL-HH-K」命名表示方案,其中「WW」(width,寬度) 和「LL」(length,長度) 分別表示以毫米為單位的模組寬度和長度。
「HH」部分是一個編碼形式,表示模組是單側或者雙側,以及已安裝組件的最大厚度。
模組防呆鍵位指定在「K-K」部分,使用 key ID 表示;它也可能指定為僅「K」,如果該模組只有一個缺口。

例如: 2280 就是寬 22mm、長 80mm 。

 

 

 

Reference:

wiki: PCI Express

Linux查看PCIe版本及速率

檢查 PCI-E 裝置的 Speed & width

M.2 SSD 選購指南 - SATA、PCIe/NVMe 掌握要訣

What is M.2? Keys and Sockets Explained

wiki: M.2

arrow
arrow
    全站熱搜

    silverwind1982 發表在 痞客邦 留言(0) 人氣()