PCIe總線的通信機制:當一個設備要想另一個設備進行讀取通信時,請求方requester需要向另一個設備發送請求request,靶向方作為事件完成方completer,以complete Packet的形式返回數據或者錯誤信息。請求的形式有:內存(memory)、輸入輸出(IO),配置(Configuration)和消息(Message)
non-posted和posted的區別是是否僅僅將數據發送到接收方就完成動作,non_posted是指請求方發送了一個包含請求的Packet之后,還要得到一個包含completion的Packet的應答,posted指的是發出請求后,不需要completer發送一個包進行應答。顯然,posted類型的操作對總線的利用效率更高。
事務層包(Transaction Layer Packet,TLP)的幾種類型:
abbreviated :縮寫
TLP的傳輸層示意圖:
圖中的示意圖以發送和接收為例,用戶層將數據發送到事務層,事務層給數據加上幀頭,並在數據的結尾添加ECRC(端到端CRC校驗)信息,再發送給數據鏈路層(Data Link Layer),護具鏈路層給接收到的TLP添加網絡封包序號和數據鏈路層CRC校驗結果,之后將數據發送到物理層,物理層給接收到的報添加其實和結束標志。
接收方反向操作。
事務層包的結構圖為:
圖中的TLP Digest即ECRC(End-to-End CRC),是可選項。此外,TLP的長度(包括其中的Header、Data和ECRC)是以DW(double word雙字,即四個字節byte)為單位。
帶回答的數據傳輸non-posted,包括Ordinary Read(正常讀取)、Locked Read(鎖存讀取)、IO/Configuration Write(IO端口、配置寫入),不帶回應的傳輸為Memory Writes和Message Writes。
1、在Ordinary read(non_posted)時,終端endpoint向system memory系統內存空間發送讀取請求(Read Request)
終端的讀請求經過兩個切換之后進入root,然后root對讀請求的包packet進行解碼,從解碼結果中識別出操作地址,再向操作地址進行讀取,將包含數據的completion packet(cplD包)發送到Endpoint。PCIe允許每個包的最大數據量(Max Data Payload)為4KB,但是實際上往往采用更小的Size(128,256,512,1024,2048)。因此,往往一個讀請求對應多個ClpD,將大於設定的Size的數據分成多個包進行分包發送。此外,在root將數據發送給請求端方式根據請求數據中的BDF(Bus,device,Function)信息查找對應的endpoint設備.
2、對於posted-write
PCIe中的寫操作都是posted的,因此請求方不需要完成方的Copletion信息,寫請求有處理器Processor發出,Root接收到寫請求指令后將數據通過寫入信息通過switch寫入到endpoint。由於沒有返回Completion,在發生錯誤時,請求方不知道錯誤的發生。但是完成方completer會將錯誤記錄到日志(log),然后向root發送報錯記錄的Message。
關於事務層傳輸的優先級問題
考慮到一些傳輸對時間要求的問題,保證這一類數據包的優先發送,PCIe標准中為每一個包都分配了一個優先級,通過事務層包的Header中的TC【2:0】進行區別,(Traffic Class,傳輸等級),TC越大,傳輸優先級越高,對應的包也會優先發送。通常支持QoS(Quallition of Service)的PCIe總線系統,對於每一個Tc值都會有一個獨立的VC(虛擬通道,viatual channel)相對應,VC就是一個buffer緩存,作用是緩存數據包。
在switch端,switch根據優先級進行包傳輸,即為端口仲裁(Arbitrition of Port),