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 型式之同款裝置。
此外,考量到 PCIe/SATA/USB 等不同介面之裝置,各自之腳位訊號與電氣特性皆存在著極大差異。
M.2/NGFF 為此定義了多組的插槽防呆位置 (或稱防呆鍵位,目前存在於實體產品之型式計有 A/B/E/M key),來避免不同硬體介面裝置因位腳座尺寸相近,而產生混插或誤插之情事,最後導致不正常運作或損壞之困擾。
由於原有 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 則無法順利安裝。
同理,對於 M key 插槽而言,B+M key 之 SSD 可以順利插入,而 B key 腳位之 SSD 則無法順利安裝。
但是並非腳座相契合必然能夠相容運作,造成 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:
M.2 SSD 選購指南 - SATA、PCIe/NVMe 掌握要訣
留言列表