设备和协议

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 上正在积极进行工作,目标是未来的版本。