主機與PCIe設備之間,或者PCIe設備與設備之間,數據傳輸都是以 Packet形式進行發送端的事務層到接收端的事務層的傳輸。根據上層(軟件層或者應用層)請求(Request)的類型、目的地址和其他相關屬性,把這些請求打包,產生TLP(Transaction Layer Packet,事務層數據包)。然后這些TLP往下,經歷數據鏈路層、物理層,最終到達目標設備,下面來看看PCIe的TLP結構:
TLP主要由三部分組成:Header、Data和CRC(可選)。TLP都是始于發送端的事務層(Transaction Layer),終于接收端的事務層。每個TLP都有一個Header,跟人類一樣,沒有頭就中止了生命,所以TLP可以沒手沒腳,但絕不能沒有頭。事務層根據上層請求內容,生成TLP Header。Header內容包括發送者的相關信息、目標地址(該TLP要發給誰)、TLP類型(諸如前面提到的Memory Read、 Memory Write之類的)、數據長度(如果有的話)等。
Data Payload 域,用以放有效載荷數據。該域不是必需的,因為不是每個TLP都一定攜帶數據,比如Memory Read TLP,它僅僅是一個請求,數據是由目標設備通過 Completion TLP 返回的。一個 TLP 最大載重是4KB,數據長度大于4KB的話,就需要分幾個 TLP 進行傳輸。
ECRC(End to End CRC)域,它對之前的Header和Data(如果有的話)生成一個CRC在接收端根據收到的TLP重新生成Header和Data(如果有的話)的CRC,與收到的CRC比較,一樣則說明數據在傳輸過程中沒有出錯,否則就有錯。它也是可選的,完全可以設置不加CRC。