先在系統中找到本章的裝置

選擇步驟後,圖中對應的元件與下方解說會加上重點標示。完整圖與所有解說會持續顯示;也可用方向鍵切換步驟。

先定位 CPU/記憶體,再沿連線走到裝置。這三步是閱讀順序;實際初始化的依賴關係在正文另行說明。

從 CPU/記憶體定位 PCIe 角色CPU與記憶體經Root Complex、Root Port及Switch連到Endpoint;連線不代表所有初始化均已完成。CPU/記憶體準備與使用工作資料Root Complex連接主機與 I/O 階層Root Port對外連線的介面Switch延伸下游連接路徑Endpoint提供裝置功能LinkLink
作者依 Base 6.0 Figure 1-2 重繪的系統關係。Port 是連接介面;Link 是相鄰連線。線條只表示連接,不指定初始化時序。

PCI Express(PCIe)讓 CPU/記憶體子系統與周邊裝置交換要求和資料。本章先沿系統拓樸認識各角色,再選定一個裝置端的連接介面,查出它支援的連線速率與目前運作結果。

  1. 主機準備工作

    這是作者簡化的邏輯拓樸;數個角色可能整合在同一顆晶片。

    CPU 與記憶體保存工作資料。Root Complex 是把這個主機子系統接到 I/O(輸入輸出)階層的角色;圖中先依連接關係閱讀。

    Base 6.0 §1.3.1/Figure 1-2,文件頁/PDF 頁 102–103。

  2. 沿相鄰連線找到裝置

    Endpoint 是提供裝置功能的端點;此圖省略 Switch 內部的個別 Port。

    Root Port 是對外建立連線的介面;Switch 是延伸下游路徑的交換器。每條 Link 只連接相鄰兩端,圖中沒有把整條路徑當成同一條連線。

    Base 6.0 §1.2–§1.3/Figures 1-1–1-3,文件頁/PDF 頁 100–107。

  3. 由軟體選定設定對象

    兩端建立 Link 後,資源配置與驅動程式的工作準備仍各有條件。

    系統軟體讀取 Function,也就是可個別辨識與設定的功能。後面的查詢會在裝置端選定一個 Function,沿設定空間清單找到連線欄位。

    Base 6.0 §1.4,文件頁/PDF 頁 108–109。

圖中元件

Root Complex:連接主機與 I/O

本圖把 CPU/記憶體所在的主機子系統接到下游路徑。

基本責任

Root Complex 是邏輯角色,不能據此推定它是一顆獨立晶片。

Switch:延伸路徑

本圖把上游連接帶到裝置所在的下游路徑。

基本責任

Switch 對設定軟體呈現為多個邏輯橋接功能;下一章會放大其內部關係。

Endpoint:提供裝置功能

本章接著在裝置端選定一個 Function,讀它的設定空間。

基本責任

Endpoint 是提供裝置功能的端點;實體卡與 Function 的數量可能不同。

從你熟悉的 CPU 與記憶體出發,先看資料要送到哪個裝置,再看軟體如何找到查詢欄位。每一步都會交代執行者、讀取位置與有效條件;圖號用來帶你回到規格的相應位置。

1. CPU 已經能存取記憶體,為什麼還需要 PCIe?

假設程式已在記憶體中準備好要傳送的資料。CPU 先安排工作,網路裝置再取得資料並執行傳送,軟體最後依裝置介面取得結果。PCIe(PCI Express,周邊互連) 提供元件交換要求與資料的共同方式;工作內容仍由裝置介面決定。

PCI Express,簡稱 PCIe(PCI Express,周邊互連),是連接系統與周邊裝置的互連架構。它定義如何發現與設定裝置,也定義元件之間如何以封包傳遞讀取、寫入及其他要求。至於「傳送哪一種網路封包」或「讀取哪一個儲存區塊」,還需要裝置本身的介面規格與驅動程式。

接下來沿這項工作分三層閱讀:先確認系統中的角色,再了解軟體查詢與配置的對象,最後追蹤要求如何到達對方。這一章先完成前兩層所需的背景,並用連線速率查詢把它們接起來。

規格依據:Base 6.0 §1.1、§1.4、§1.5

PCI Express Base Specification Revision 6.0,文件頁/PDF 頁 99–100、108–113。這裡的網路工作情境是教學舉例;互連、設定模型與分層功能依上述章節。

2. 從 CPU 到裝置,途中有哪些角色?

沿開頭的圖往下看:Root Complex 負責把主機子系統接到 I/O 階層,Root Port 提供向外的連接介面,Switch 延伸下游路徑,Endpoint 提供裝置功能。先固定這組角色,後文再把觀察範圍縮到裝置端的設定資料。

I/O
Input/Output,輸入與輸出。在這裡指系統與周邊裝置之間的互動。
Port、Link 與 Lane
Port 是連接介面;Link 是相鄰兩端之間的連線;Lane 是構成 Link 的傳輸通道。每個 Lane 各有一組傳送與接收差動訊號對。x4 表示這條 Link 使用 4 個 Lane,不表示接了 4 個裝置。

圖中分開畫出的 CPU、Root Complex 與記憶體是邏輯角色。實際產品可以將其中幾個角色整合在同一顆晶片內;讀拓樸時,先追蹤它們的連接與職責,再另查產品的實體配置。

一張卡就是一個 Function 嗎?

不一定。軟體辨識與設定的基本對象是 Function。一個實體裝置可以提供多個 Function,各自有設定空間。傳統編址會用 Bus、Device、Function 三個號碼定位,常合稱 BDF(Bus、Device、Function 識別號);如果系統有多個 Segment(匯流排的邏輯分組),還要先指定 Segment(匯流排的邏輯分組)。Segment 是由韌體管理、供 OS 使用的邏輯分組;不同 Segment 可以重複使用相同的 Bus 號碼,但同一個 Segment 內的 Bus 號碼必須唯一。它不是圖上額外插入的一個硬體元件。

BDF
Bus/Device/Function,匯流排、裝置與功能識別
規格依據:Base 6.0 §1.2–§1.3、§7.1;Firmware 3.3 §1.3

Base 6.0,文件頁/PDF 頁 100–108,Figure 1-2 位於 103;§7.1 位於 903–904。PCI Firmware Specification Revision 3.3,§1.3,文件頁/PDF 頁 8–9,說明 Bus/Device/Function 與 Segment。圖中的實際配置與 BDF(Bus、Device、Function 識別號) 都是教學假設。

3. 裝置接上以後,為什麼還不能立刻使用?

沿路徑找到裝置後,還要依序檢查連線、發現、資源配置與驅動準備。下表用開機時需要使用的裝置整理這些工作的依賴關係;實際平台可以分階段處理,韌體與 OS 也可能各完成一部分。

教學流程:從連線到工作
先要完成的工作誰在處理完成後能說明什麼
電源、重置與就緒條件適當,兩端建立 Link平台與裝置硬體;Link 的初始速率與寬度協商由兩端硬體處理相鄰兩端具備通訊條件;尚未證明驅動程式已可使用裝置
讀取設定空間,發現 Function 並辨識其結構韌體或 OS 的系統軟體系統知道有哪些 Function;這個過程通常稱為 enumeration,亦即枚舉
配置位址資源與橋接器轉送範圍,設定必要控制韌體或 OS,依平台與啟動階段分工裝置的相關資源已有可用的配置;仍要符合各項啟用條件
設定裝置自己的工作介面與資料結構該裝置的驅動程式裝置才具備執行這項工作的軟體環境

這裡的韌體是主機平台韌體,和網卡或 SSD 裡執行的裝置韌體不是同一個角色。UEFI(Unified Extensible Firmware Interface)定義 OS 與平台韌體之間的介面;UEFI 環境也提供 PCI 裝置存取服務。OS 是 Operating System,也就是作業系統。

交接時也不能假設「韌體早已把每個裝置都設好了」。Firmware 3.3 §3.5 要求韌體設定開機與主控台所需裝置,以及通往它們的完整路徑;同節另要求設定所有 Host Bridge。Host Bridge 是主機與 PCI 位址空間之間的橋接角色;不要把「所有 Host Bridge」讀成「所有 Endpoint」。

ACPI(Advanced Configuration and Power Interface)則提供硬體、軟體介面及資料結構,支援 OS 主導的組態與電源管理。它和 UEFI 各有工作範圍;後續課程會在需要查平台資源與控制權時,再展開相關表格與方法。

規格依據與補充閱讀:初始化、韌體交接

Base 6.0 §1.2,文件頁/PDF 頁 102,說明初始 Link 協商;§1.4,頁 108–109,說明發現、資源與控制模型。Firmware 3.3 §3.1–§3.2,文件頁/PDF 頁 32–33,說明 UEFI PCI 服務;§3.5,頁 34–35,說明交接時的配置要求。背景補充:UEFI 2.11 §2 Overview、ACPI 6.6 §1 Introduction。此處只引用其介面角色,未將新版細節套入 Firmware 3.3。

4. 讀設定空間、讀裝置暫存器與 DMA,有什麼不同?

DMA
Direct Memory Access,裝置直接存取記憶體

軟體會在不同位置讀取或設定硬體欄位。先看這次操作的目的:查裝置能力時讀設定空間,操作裝置工作介面時使用其資源位址,裝置搬移資料時則使用準備好的記憶體映射。規格中的 register 指暫存器;它所屬的空間決定了查找方法。

從目的分辨三種存取
現在想做什麼讀取或操作的對象應先找哪一類資料
辨識 Function,查詢 PCIe 能力與連線狀態該 Function 的 Configuration Space,設定空間設定標頭、Capability 結構與欄位定義
透過記憶體映射介面操作裝置分配給裝置的記憶體位址範圍BAR 描述的資源與裝置本身的暫存器規格
讓裝置搬移工作資料軟體準備並映射給裝置使用的記憶體DMA 緩衝區、裝置可用位址及存取條件
BAR
Base Address Register,基底位址暫存器
DMA
Direct Memory Access,裝置直接存取記憶體
BAR
Base Address Register,基底位址暫存器,位於設定空間,用來描述或設定裝置的位址資源。BAR 不是資料緩衝區本身。
MMIO
Memory-Mapped I/O,記憶體映射 I/O。CPU 透過被映射的位址存取裝置介面;這種存取不能一概視為普通 RAM 讀寫。
DMA
Direct Memory Access,直接記憶體存取。在本章的情境中,由裝置發起資料存取;CPU 仍需先安排工作、緩衝區與必要設定。

例如,讀取 Link Status 是在查設定空間;寫入網路裝置的工作暫存器,則可能走 BAR(描述裝置位址資源的基底位址暫存器) 所對應的 MMIO(以記憶體映射操作裝置) 範圍。裝置接著讀取傳送資料,是另一筆由裝置發起的存取。這三件事可能出現在同一項工作裡,但它們回答的問題不同。

MMIO
Memory-Mapped I/O,記憶體映射輸入輸出

本章只讀設定空間,不做資源配置或實際 DMA(由裝置直接存取記憶體)。CPU 看到的位址和裝置使用的位址也不保證相同;後續談資源配置與位址轉譯時,會把這個差別展開。

規格依據:位址空間與裝置存取

Base 6.0 §1.4–§1.5.1,文件頁/PDF 頁 108–110;§2.1.1,頁 116–117;§7.5.1.2.1,頁 928–930,說明 BAR 的資源配置用途與欄位(Figure 7-11、Figure 7-12 位於 929)。Firmware 3.3 §3.1,頁 32–33,區分 CPU 與 PCI 位址視角及 UEFI PCI 存取服務。網路工作的操作順序屬教學情境,不是某款網卡的程式設計規範。

同一筆讀取,為什麼要分三層查?

接續前面的記憶體讀取:Endpoint 發出 Request,經過 Switch 到達目標,再等待 Completion(完成回覆)。Figure 1-4 把每個元件的收送功能分成三個邏輯層;Figure 1-5 則用封包流向說明各層如何接手。這是閱讀規格的分工,不要求硬體內部一定照圖切成三塊電路。

手機閱讀時,可左右滑動表格查看完整內容。

層先問什麼?與案例的關係
Transaction Layer(交易層)要求什麼、送到哪裡、回覆對應哪筆要求?建立與解讀 TLP(Transaction Layer Packet,交易層封包),並管理 TLP 的 Flow Control。
Data Link Layer(資料鏈結層)這一條 Link 上的資料是否完整交付?處理逐 Link 的完整性、確認與重送;Switch 兩側各有獨立的 Link。
Physical Layer(實體層)兩端如何建立 Link、使用哪些 Lane 傳輸?處理 Link 初始化、Lane 和訊號傳輸等工作。

分析時可以先沿這條路線:確認正在觀察哪一條 Link → 看實體連線及 Link 狀態 → 檢查該段傳輸與 Flow Control → 最後配對 Request 和 Completion。某段 Link 的傳輸成功,只能支持該段的結果;要確認整筆讀取,還要看回覆是否真的到達 Requester。

Figure 1-5 是分層概念圖;實際封包如何承載與保護,還要依 Non-Flit Mode 或 Flit Mode 查對應章節,不能把圖中每個傳輸細節直接套到所有模式。

相鄰層還要交換資料邊界、傳送握手、電源與 Link 狀態等資訊;哪些訊息在兩個介面之間傳遞,可接著查 §1.5.4.4。這些是邏輯服務,內部介面的具體實作不由這張分層圖決定。

Base 6.0 §1.5、Figures 1-4/1-5,pp.109–110;§§1.5.1–1.5.4.4,pp.110–114。此處的讀取與 Switch 路徑為教學情境。

5. 打開規格後,怎麼知道該先看哪裡?

現在把問題限定為同一個裝置端的 Port:它宣告支援哪些速率,而相鄰 Link 目前使用哪個速率?先查能力,再查狀態。若要了解軟體設定的速率上限,還要另外查看控制欄位;這個延伸問題會在連線章處理。

PCIe 每個 Function 的設定空間擴充為 4096 bytes。前 256 bytes 保留 PCI 相容區域,其中有設定標頭與傳統 Capability(描述或控制能力的結構) 清單;後面的區域可放 PCI Express Extended Capabilities。PCI Express Capability(描述或控制能力的結構) 本身位於前 256 bytes 的清單裡,不要因為名稱帶有 PCI Express,就直接跳去找 Extended Capability。

Capability 是一組用來描述或控制特定能力的結構。它在設定空間中的起點不必固定;軟體要先沿指標找到它,再加上結構內的相對位移。因此,規格標示的「Offset 2Ch」還不是本例的最終存取位置。

這個問題的規格閱讀路徑(Base 6.0)
閱讀位置要從這裡取得什麼下一步為什麼需要它
Figure 7-8/Table 7-7,pp.924–925;Figure 7-10,p.928;Figure 7-6/Table 7-5,pp.921–922;§7.5.1.1.11,p.926Type 0 設定標頭、Capabilities List 狀態與初始指標知道從哪裡開始找 Capability
Figure 7-18/Table 7-14,p.945;Figure 7-22/Table 7-18,p.953本例經過的 PM Capability 與 PCIe Capability 的 ID/Next Pointer分辨目前走到哪一個結構,決定是否繼續沿指標走
Figure 7-23/Table 7-19,pp.953–954PCIe Capability Version 與 Device/Port Type確認本例使用的結構版本與元件類型
Figure 7-21,p.952整個 PCIe Capability 的配置把結構起點加上正確的欄位位移
Figure 7-38/Table 7-35,pp.998–1000Link Capabilities 2 與速率向量定義判斷 Port 宣告的支援集合
Figure 7-29/Table 7-26,pp.978–979Link Status 的速率、寬度與有效條件把目前狀態與能力分開判讀

這裡先看 Figure 7-38,再回到 Figure 7-29,因為我們先問能力,再問狀態。Figure 幫你找到結構與位元位置;Table 和相鄰條文則說明編碼、適用對象及例外。只看到圖上的欄位名稱,還不足以判斷讀值。

規格依據:設定空間與 Capability 的位置

Base 6.0 §7.2,文件頁/PDF 頁 905–907,Figure 7-3 位於 906;§7.5.3,頁 951–954。表中的頁碼皆為本份 Base 6.0 的文件頁,也與 PDF 檢視器頁序一致。

6. 完整案例:支援哪些速率,現在又跑多少?

把查詢位置與欄位意思接起來

選擇步驟後,圖中對應的元件與下方解說會加上重點標示。完整圖與所有解說會持續顯示;也可用方向鍵切換步驟。

依箭頭讀取清單,再分別查能力與狀態;兩個分支是不同查詢目的,不是硬體狀態轉移。

先找到結構,再分別讀能力與狀態從傳統清單找到0x70,再分別加上能力與狀態欄位的相對位移。設定標頭0x34 → 0x40電源管理結構ID=0x01;Next=0x70PCIe 能力結構ID=0x10;起點=0x70支援速率起點+0x2C → 0x9C目前連線狀態起點+0x12 → 0x82先核對版本與適用類型
作者的查詢閱讀圖。Next Pointer 從 Function 起點計算;欄位的相對位移從已找到的能力結構起點計算。
  1. 從設定標頭取得入口

    本例設定讀取成功;所有位置以該 Function 設定空間為起點。

    確認標頭形式與清單存在後,讀 0x34,遮罩低位元取得第一個結構的位置 0x40。

    Base 6.0 Figures 7-8/7-10、Table 7-7、§7.5.1.1.11,文件頁/PDF 頁 924–928。

  2. 沿下一項指標找到能力結構

    0x70 是作者假設;其他裝置的清單順序與起點可以不同。

    先辨識電源管理結構,再沿 Next Pointer(下一項位置)到 0x70,確認 ID=0x10。這個起點由本次清單取得。

    Base 6.0 Figure 7-18/Table 7-14、Figure 7-22/Table 7-18,文件頁/PDF 頁 945、953。

  3. 確認結構適用,再讀兩個欄位

    本例是一般 Endpoint,排除 RCiEP 與 VF;速率向量已實作,Link 已建立且穩定。

    VF
    Virtual Function,虛擬功能

    先核對 Capability Version(結構版本)與 Device/Port Type(功能類型),再由起點加上相對位移。能力向量回答支援集合,狀態編碼回答目前速率與寬度。

    Base 6.0 Figures 7-21/7-23/7-38/7-29、Tables 7-19/7-35/7-26,文件頁/PDF 頁 952–954、998–1000、978–979。

本例取得的設定資料
設定空間 offset讀取寬度假設讀值資料用途
0x0E8 bits0x00Header Type
0x0616 bits0x0010Status
0x348 bits0x40Capabilities Pointer
0x4016 bits0x7001第一個 Capability 的 ID 與下一個指標
0x7016 bits0x0010PCIe Capability 的 ID 與下一個指標
0x7216 bits0x0002PCI Express Capabilities Register
0x9C32 bits0x0180001ELink Capabilities 2
0x8216 bits0x0043Link Status

表格顯示的是按照指定寬度取得的數值。若改成逐 byte 顯示,0x7001 在 offset 0x40 的 byte 是 0x01,下一個 byte 才是 0x70;不要把數值左側的十六進位數字當成最低位址的 byte。

第一步:我真的可以從這個標頭找 Capability 嗎?

先用 Header Type 的低 7 bits 判斷標頭形式:0x00 & 0x7F = 0,所以使用 Figure 7-10 的 Type 0 配置。bit 7 另有多功能裝置的意義,不應混進標頭類型。接著查 Status 的 bit 4:(0x0010 & 0x0010) != 0,確認 Capabilities List 為 1。

現在依 §7.5.1.1.11,讀取 offset 0x34 的 Capabilities Pointer。規格要求軟體在使用這個指標前遮掉最低兩個 bits,因此本例得到 0x40 & 0xFC = 0x40。這個值告訴我們第一個結構從哪裡開始,還沒有告訴我們它是 PCIe Capability。

第二步:第一個 Capability 不是我要的,接著去哪裡?

在 0x40 讀到 0x7001。低 8 bits 的 ID 是 0x01,本例對照 Figure 7-18/Table 7-14,得知這是 Power Management(電源管理)Capability。高 8 bits 的 Next Pointer 是 0x70,所以接著移到 0x70。不需要為了通過這個節點,就把它的所有電源欄位讀完。

在 0x70 讀到 0x0010。依 Figure 7-22/Table 7-18,ID 0x10 表示 PCI Express Capability;高 8 bits 為 0,表示此結構沒有下一個清單節點。我們已找到目標,記下結構起點 cap_base = 0x70。

  1. 設定標頭
    0x34 → 0x40
    找到清單入口
  2. PM Capability
    ID 0x01 / Next 0x70
    依 Next Pointer 往下找
  3. PCIe Capability
    ID 0x10 / Next 0
    記下起點 0x70

這條路徑是本例的安排。其他裝置的 Capability 起點與順序可以不同,不能把 0x70 寫成通用常數。如果清單走到結尾仍未找到目標,或出現循環等不合理資料,就沒有足夠依據繼續套用這份結構。這是讀取資料時的檢查原則,不代表所有「讀不到」都能解成不支援。

第三步:找到 PCIe Capability,就能直接讀任何欄位嗎?

還要核對版本與適用對象。在 cap_base + 0x02 = 0x72 讀到 0x0002。依 Figure 7-23/Table 7-19,bits 3:0 為 2,表示 Capability Version 2;bits 7:4 為 0,表示 PCI Express Endpoint,與本例假設一致。

這裡的 Version 2 是這個 Capability 結構的版本,不表示裝置是「PCIe Gen2」,也不是在宣告支援 Base 2.0 的全部功能。相同地,本章拿 Base 6.0 當參考文件,不代表這個例子一定支援 64 GT/s。

Base 6.0 §7.5.3 會依元件類型說明哪些暫存器適用。RCiEP 就不能照本例套用一般外部 Link 的欄位。另外,Version 2 本身不保證較早期硬體已實作 Link Capabilities 2 的速率向量;§7.5.3.18 的實作說明(p.1000)另外交代舊硬體的判讀方式。本例假設該欄位已實作,後面也會取得非零的向量值,因此不需要在此展開舊硬體分支。

第四步:怎麼從結構起點算出讀取位置?

Figure 7-21 把 Link Capabilities 2 放在相對位移 0x2C,Link Status(連線狀態暫存器) 放在 0x12。兩個值都要加到剛找到的 cap_base:

Link Capabilities 2:0x70 + 0x2C = 0x9C(讀 32 bits)
Link Status        :0x70 + 0x12 = 0x82(讀 16 bits)

0x70 + 0x0C = 0x7C 是另一個 Register:Link Capabilities。名稱相近,位置卻不同。本題要列出支援速率集合,因此使用 Link Capabilities 2 裡的 Supported Link Speeds Vector。

第五步:如何把能力讀值轉成支援速率?

在 0x9C 讀到 0x0180001E。Figure 7-38/Table 7-35 把 Supported Link Speeds Vector 放在整個 Register 的 bits 7:1。先遮掉其他 bits,再把欄位移到最低位置:

保留 bits 7:1:0x0180001E & 0x000000FE = 0x0000001E
右移 1 bit   :0x0000001E >> 1 = 0x0F = 0001111b

右移後,表格所說的「欄位內 bit 0」才對應 0x0F 的最低位元。它原本位於 Register 的 bit 1。這兩種編號差 1,讀表時要先看清楚表格是在說整個 Register,還是欄位內的位置。

Supported Link Speeds Vector 的位元判讀
Register bit欄位內 bitBase 6.0 的意義本例的值
102.5 GT/s1,支援
215.0 GT/s1,支援
328.0 GT/s1,支援
4316.0 GT/s1,支援
5432.0 GT/s0,不支援
6564.0 GT/s0,不支援
76RsvdP,保留位元0,不賦予速率意義

因此,這個 Port 宣告支援 2.5、5.0、8.0 與 16.0 GT/s。在 PCIe 規格中,GT/s 以每個 Lane、每個方向的編碼位元傳輸速率計算;它不是應用程式每秒取得的 GB 數。若要估算有效資料量,還要考慮 Lane 數、編碼方式、封包開銷與實際工作負載,本題先不做這個換算。

為什麼假設值是 0x0180001E,而不是 0x0000001E?

這裡提供的是完整 32-bit 讀值。Base 6.0 Table 7-35(文件頁/PDF 頁 999–1000)要求:宣告支援 16.0 GT/s 或更高速率時,Register bits 23 與 24 的 Retimer Presence Detect Supported、Two Retimers Presence Detect Supported 必須為 1。因此本例保留這兩個 bits,得到 0x0180001E。它們表示偵測能力,不是本例路徑已裝有 Retimer 的證據。這些能力的詳細用途留待後續章節,本題只取 bits 7:1。

第六步:目前速率是另一個 bitmap 嗎?

不是。Link Status 的 bits 3:0 是 Current Link Speed,儲存的是編碼值。本例在 0x82 讀到 0x0043,所以:

目前速率代碼:0x0043 & 0x000F = 3
協商後寬度  :(0x0043 & 0x03F0) >> 4 = 4

Table 7-26 把速率代碼 3 對應到 Supported Link Speeds Vector 的欄位內 bit 2,也就是 8.0 GT/s;寬度值 4 表示 x4。不能把代碼 3 當成 3 GT/s,也不能把它當成同時設定了兩個支援位元。

同一張表也指出,Link 未建立時,Current Link Speed 與 Negotiated Link Width 的值是 undefined,不能用來判斷目前有效連線。本例已把 Link 建立且穩定列為前提;單靠這個 0x0043 並不能自行證明前提成立。這個 16-bit 假設值中,bits 15:10 都是 0;但不能因此把 bit 13 的 Data Link Layer Link Active 為 0 解讀成 Link 已中斷,因為該 bit 是否實作還取決於元件的回報能力。實際查詢仍須依適用狀態確認連線。

第七步:現在可以下什麼結論?

案例推演:在本例前提成立時,所查 Port 宣告支援 2.5/5.0/8.0/16.0 GT/s,而其 Link 目前以 8.0 GT/s、x4 運作。這個讀值尚未說明為什麼沒有使用 16.0 GT/s。

還需要另一端的能力、相關控制設定與連線狀態,才能繼續分析。x4 是目前協商的寬度,並不能證明最大支援寬度也是 x4。也不能只憑這些欄位就宣稱裝置故障、平台已啟用所有功能,或應用程式一定能達到某個吞吐量。這些都是不同的問題,需要各自的證據。

完整案例的來源與教學假設

規範位置依前節的閱讀路徑表。Header Type 另見 Base 6.0 §7.5.1.1.9,Figure 7-8/Table 7-7,頁 924–925;設定空間採 little-endian(小端序)的說明見 §7.5.1.1,頁 916;Link Active 回報能力與狀態的關係另見 Table 7-23、Table 7-26,頁 969、979。所有 BDF、Capability 起點、清單順序與讀值均為教學假設;遮罩、加法、欄位解碼與結論是依假設推導的結果,並非規格中的原始案例。

7. 把完整查詢帶到不同條件

把剛才的查詢接成一條完整路徑:選定 Function,取得清單入口,找到能力結構,核對版本與類型,再分別解碼支援集合與目前狀態。以下延伸說明沿用這條路徑,只改動一項條件,指出應重新檢查的位置。

如果 PCIe Capability 改從 0x90 開始,還能去 0x9C 讀 Link Capabilities 2 嗎?

不能沿用本例的絕對 offset。應重新計算 0x90 + 0x2C = 0xBC;Link Status 則是 0x90 + 0x12 = 0xA2。結構內位移不變,清單找到的起點變了,最終讀取位置也會改變。

依據:Base 6.0 Figure 7-21,p.952;起點 0x90 是新的教學假設。

如果 Current Link Speed 讀到 4,可以說它同時支援兩種速率嗎?

不可以。這是編碼欄位;在 Link 已建立等前提成立時,代碼 4 指向速率向量的欄位內 bit 3,表示目前為 16.0 GT/s。支援集合仍須讀取 Supported Link Speeds Vector。

依據:Base 6.0 Table 7-26、Table 7-35,pp.978、998;代碼 4 是本題假設。

Link 已經中斷,手上仍有 0x0043 這筆讀值,可以把它報成目前的 8.0 GT/s、x4 嗎?

不可以。兩個欄位在 Link 未建立時沒有可用來描述當前連線的有效語意。應先確認連線狀態,再決定是否採用這次速率與寬度讀值;數字看起來合理,並不會讓無效條件消失。

依據:Base 6.0 Table 7-26,p.978。

系統已能讀取網路裝置的設定空間,是否表示裝置已能從記憶體取走封包資料?

還不能這樣判斷。設定空間可讀,只說明目前已能進行這種設定存取。裝置自己的工作介面、記憶體映射、資料緩衝區及發起存取所需條件,仍可能尚未準備完成。要證明資料工作可執行,需要往資源配置與驅動程式初始化繼續查。

依據:Base 6.0 §1.4,pp.108–109;Firmware 3.3 §3.1–§3.2、§3.5,pp.32–35。情境由作者設計。

8. 接下來先補哪一塊?

下一章會沿著拓樸往下看:實體裝置、Function 與 Bridge 如何對應,BDF 又能辨識到什麼範圍。接著在 Chapter 2 建立設定空間的完整地圖,再追問:「這個 BDF 一開始是怎麼被發現的?BAR 的位址又是誰分配的?」

完整安排見課程閱讀路線。現有課程涵蓋 Chapter 0–37;可以從 Chapter 1 開始,依主題逐步深入。全規格的逐節核對仍在進行,已有章節不代表所有細節都已完成教學。

版本與來源

本章來源的用途
文件與版本本章引用範圍使用方式
PCI Express Base Specification,Revision 6.0,Version 1.0§1、§2.1.1、§7.1–§7.5.3 的相關段落技術定義、Figure/Table、欄位與判讀條件的主要依據;使用讀者提供的 PDF
PCI Firmware Specification,Revision 3.3,2021-01-20§1.2–§1.3、§3.1–§3.2、§3.5Segment、韌體服務、位址視角與 OS 交接背景;使用讀者提供的 PDF
UEFI Specification 2.11,§2UEFI 的介面角色與 PCI 裝置服務概觀官方補充背景;不把新版規則當成 Firmware 3.3 的原文
ACPI Specification 6.6,§1OS 主導的組態與電源管理概觀官方補充背景;細部表格與方法留待相關章節核對

外部來源查核日期:2026-10-19。規格頁碼會隨版本改變,本章的 Figure、Table 與頁碼只對應上述指定版本。原始 PDF 不隨教材散布;自製關係圖、示例讀值與情境推演均已在相鄰內容標示。