裝置和協議

CXL 裝置的型別(記憶體、加速器等)決定了許多配置步驟。本節介紹裝置型別和平臺上使用的片上資源的一些基本背景知識,以及影響配置的作業系統。

協議

CXL 有三個核心協議。出於本文件的目的,我們將只討論非常高階的定義,因為具體的硬體細節在很大程度上是從 Linux 中抽象出來的。有關更多詳細資訊,請參閱 CXL 規範。

CXL.io

基本互動協議,類似於 PCIe 配置機制。通常用於初始化、配置以及對記憶體 (CXL.mem) 或快取 (CXL.cache) 操作之外的任何內容的 I/O 訪問。

Linux CXL 驅動程式透過各種 sysfs 介面和 /dev/cxl/ 裝置(它暴露了對裝置郵箱的直接訪問)公開對 .io 功能的訪問。

CXL.cache

裝置可以連貫地訪問和快取主機記憶體的機制。

一旦配置完成,Linux 基本上是透明的。

CXL.mem

CPU 可以連貫地訪問和快取裝置記憶體的機制。

一旦配置完成,Linux 基本上是透明的。

裝置型別

Type-1

Type-1 CXL 裝置

  • 支援 cxl.io 和 cxl.cache 協議

  • 實現完全連貫的快取

  • 允許裝置到主機的連貫性和主機到裝置的偵聽。

  • 不具有主機管理的裝置記憶體 (HDM)

type-1 裝置的典型示例是智慧 NIC - 它可能希望直接操作主機記憶體 (DMA) 來儲存傳入的資料包。這些裝置在很大程度上依賴於連線到 CPU 的記憶體。

Type-2

Type-2 CXL 裝置

  • 支援 cxl.io、cxl.cache 和 cxl.mem 協議

  • 可選地實現連貫快取和主機管理裝置記憶體

  • 通常是具有高頻寬記憶體的加速器裝置。

type-1 和 type-2 裝置之間的主要區別在於主機管理裝置記憶體的存在,這允許裝置在本地儲存體上執行 - 而 CPU 仍然可以連貫地 DMA 到相同的記憶體。

這允許像 GPU 這樣的裝置透過 DAX 裝置或檔案描述符公開其記憶體,允許驅動程式和程式直接訪問裝置記憶體,而不是使用塊傳輸語義。

Type-3

Type-3 CXL 裝置

  • 支援 cxl.io 和 cxl.mem

  • 實現主機管理裝置記憶體

  • 可以提供易失性或永續性記憶體容量(或兩者)。

type-3 裝置的一個基本示例是簡單的記憶體擴充套件器,其本地記憶體容量暴露給 CPU,以便透過基本連貫 DMA 直接訪問。

交換機

CXL 交換機是一種裝置容量,用於在上游、下游或對等裝置之間路由任何 CXL(以及擴充套件的 PCIe)協議。 許多裝置(例如多邏輯裝置)意味著以某種方式存在交換。

邏輯裝置和頭

CXL 裝置可以向一個或多個主機(透過物理“頭”)呈現一個或多個“邏輯裝置”。

單邏輯裝置 (SLD) 是一種向一個或多個頭呈現單個裝置的裝置。

多邏輯裝置 (MLD) 是一種可以向一個或多個裝置呈現多個裝置的裝置。

單頭裝置僅公開單個物理連線。

多頭裝置公開多個物理連線。

MHSLD

多頭單邏輯裝置 (MHSLD) 向可能連線到一個或多個離散主機的多個頭公開單個邏輯裝置。 這方面的一個例子是一個簡單的記憶體池,它可以在啟動之前靜態配置,以透過 CEDT 將其部分記憶體公開給 Linux。

MHMLD

多頭多邏輯裝置 (MHMLD) 向可能連線到一個或多個離散主機的多個頭公開多個邏輯裝置。 這方面的一個例子是動態容量裝置,可以在執行時配置該裝置,以將其部分記憶體公開給 Linux。

示例裝置

記憶體擴充套件器

Type-3 裝置最簡單的形式是記憶體擴充套件器。 記憶體擴充套件器將主機管理裝置記憶體 (HDM) 公開給 Linux。 此記憶體可以是易失性的,也可以是非易失性的(持久的)。

記憶體擴充套件器通常被認為是單頭、單邏輯裝置的一種形式 - 因為它的外形尺寸通常是附加卡 (AIC) 或某些其他類似的外形尺寸。

Linux CXL 驅動程式提供對基本記憶體擴充套件器的靜態或動態配置的支援。 平臺可以在 OS 初始化之前(例如,自動解碼器)對解碼器進行程式設計,或者如果平臺將這些操作推遲到 OS,則使用者可以對結構進行程式設計。

可以將多個記憶體擴充套件器新增到外部機箱,並透過連線到 CXL 交換機的頭將其公開給主機。 這是一個“記憶體池”,並且將被認為是 MHSLD 或 MHMLD,具體取決於交換機平臺提供的管理功能。

截至 v6.14,Linux 沒有提供正式的介面來管理非 DCD MHSLD 或 MHMLD 裝置。

動態容量裝置 (DCD)

動態容量裝置是一種 Type-3 裝置,它提供記憶體容量的動態管理。 DCD 的基本前提是為物理記憶體容量提供一個類似分配器的介面,以便為“Fabric Manager”(一個外部的、具有特權的、具有更改其他主機配置許可權的主機)提供介面。

DCD 管理“記憶體範圍”,這些範圍可以是易失性的或永續性的。 範圍也可以是單個主機獨有的,也可以在多個主機之間共享。

截至 v6.14,Linux 沒有提供正式的介面來管理 DCD 裝置,但是 LKML 上正在積極進行工作,目標是未來的版本。