当将 CXL Type3 设备内部存储空间 DPA,并映射到系统物理地址空间形成 HPA 区域,CXL 使用 CXL REGION 为系统屏蔽了 HPA 到 DPA 映射的细节,操作系统可以将 HPA 当做正常的物理区域使用. 为了方便操作系统对 HPA 的使用,操作系统可以将 CXL REGION 切换成不同的模式,以此以不同的形态展现在系统硬件层面,主要包括三种模式: SYSTEM-RAM、DEVDAX 和 FSDAX.
FSDAX 模式 是 CXL REGION 的一种配置模式,通过将 CXL 内存格式化为支持 DAX(Direct Access) 的文件系统(如 EXT4、XFS),允许应用程序通过标准文件接口直接访问内存,同时绕过传统的块设备层和页缓存. 此模式结合了文件系统的易用性与直接内存访问的高性能,特别适合需要持久化存储和文件接口的场景. 其核心特点是:
- 文件系统抽象: 通过标准文件系统(如 EXT4、XFS)管理 CXL 内存,支持文件操作(如 open、read、write)
- 直接内存访问: 通过 DAX 机制,文件数据直接映射到内存,减少数据拷贝和上下文切换
- 持久化支持: 若 CXL 设备支持非易失性内存(PMEM),文件系统数据可在断电后保留
FSDAX 模式 是 CXL Region 中性能最优的配置方式,专为需要极致延迟和直接内存访问的场景设计, 常见的应用场景包括:
- 高性能文件存储: 临时数据高速缓存(如 AI 训练中间结果), 将 CXL 内存配置为 FSDAX 文件系统,提供低延迟、高吞吐量的存储.
- 持久化数据库: SQLite、MySQL 等数据库需持久化存储和文件接口, 将数据库文件存储在 FSDAX 文件系统中,通过标准文件 API 实现高效数据操作
- 混合工作负载: 同时需要文件系统管理和低延迟访问的场景(如日志系统), 利用 FSDAX 的文件系统抽象和直接内存访问特性,平衡易用性与性能
在 FSDAX 模式下,CXL Type3 设备只能是 PMEM. 当 CXL Type3 设备的 CXL REGION 创建完毕之后,可以借助 cxl-ctrl、ndctl 和 daxctl 工具设置 CXL REGION 的模式为 FSDAX, 接下来边实践边进行讲解, 实践案例在 BiscuitOS 上的部署逻辑如下:
# 切换到 BiscuitOS 项目目录
cd BiscuitOS
# 通过 Kbuild 选择需要部署的应用程序
make menuconfig
[*] DIY BiscuitOS/Broiler Hardware --->
<*> Intel Q35
[*] CXL: Compute Express Link
CXL Hardware Topology (CXL2.0: x1 VCS + x1 Type3 PMEM) --->
[*] package --->
[*] HETEROGENEOUS MEMORY MANAGEMENT --->
[*] CXL REGION: FSDAX MODE --->
# 配置完毕保存,然后进行部署
make
# 安装必备工具
cd BiscuitOS/output/linux-6.10-x86_64/package/BiscuitOS-CXL-REGION-FSDAX-default
# 第一次执行如下命令
make prepare
make download
make tar
make configure
# 运行 BiscuitOS
make build
当 BiscuitOS 运行之后,直接运行 RunBiscuitOS.sh, 该脚本包含了实践所需的全部命令, 在运行实践案例之前,查看 /dev/ 目录下并未存在 daxX.Y 字符设备. 接着运行脚本,可以看到脚本创建了一个 CXL REGION,并将 CXL REGION 的模式设置为 DEVDAX 模式,接着可以看到实践案例从 CXL REGION 的内存里读到数据,最后确认新增 /dev/dax0.0 字符设备. 接下来查看一下实践案例源码:
实践案例由一个应用程序构成,其在 25 行打开 “/mnt/DAX/BiscuitOS.txt” 文件,然后在 30 行调用 mmap 函数分配一段虚拟内存映射文件,接着在 39-40 行对虚拟内存进行读写访问,最后在 43 行释放内存. 对 CXL REGION FSDAX 模式的使用无需进行定制修改,接下来看一下 CXL REGION FSDAX 创建过程:
# 清空所有的 CXL REGION
cxl destroy-region -f all
# 创建一个新的 CXL REGION
# 大小为 512M, 交织粒度为 4096, 来自一个 CXL Type3 设备 mem0
cxl create-region -d decoder0.0 -m mem0 -s 512M -t ram -w 1 -g 4096 -u
# 使能 CXL REGION
cxl enable-region region0
# 清空所有的 NAMESPACE
ndctl destroy-namespace --force all
# 使能 REGION0 对应的 NAMESPACE
ndctl enable-region region0
# 将 REGION0 的模式切换成 FSDAX
ndctl create-namespace --mode=fsdax -f
# 为 REGION0 BLOCK DEVICE 创建 EXT4 文件系统
mkfs.ext4 -b 4096 -E stride=512 -F /dev/pmem0
# 将文件系统挂载到指定目录
mkdir -p /mnt/DAX
mount -o dax=always,lazytime /dev/pmem0 /mnt/DAX/
echo "Aello BiscuitOS" > /mnt/DAX/BiscuitOS.txt
当 CXL REGION 的模式设置为 FSDAX 模式之后,系统会为 CXL REGION 创建一个 BLOCK 块设备,该块设备可以跨过 PAGE CACHE,直接访问 CXL MEMORY,也就是 DAX 机制. FSDAX 的好处是可以向标准文件系统一样访问 CXL MEMORY,由于该模式只支持 PMEM 的 CXL Type3 设备,因此掉电也可以存储数据,因此可以作为文件系统或者 SWAP SPACE 使用. 那么接下来实践案例如何在用户态使用 FSDAX 模式下的 CXL REGION, 实践案例在 BiscuitOS 上的部署逻辑如下:
# 切换到 BiscuitOS 项目目录
cd BiscuitOS
# 通过 Kbuild 选择需要部署的应用程序
make menuconfig
[*] DIY BiscuitOS/Broiler Hardware --->
<*> Intel Q35
[*] CXL: Compute Express Link
CXL Hardware Topology (CXL2.0: x1 VCS + x1 Type DDR) --->
[*] package --->
[*] HETEROGENEOUS MEMORY MANAGEMENT --->
[*] CXL FSDAX: ACCESS ON USERSPACE --->
# 配置完毕保存,然后进行部署
make
# 安装必备工具
cd BiscuitOS/output/linux-6.10-x86_64/package/BiscuitOS-CXL-FSRAM-USERSPACE-default
# 第一次执行如下命令
make prepare
make download
make tar
make configure
# 运行 BiscuitOS
make build
当 BiscuitOS 运行之后,直接运行 RunBiscuitOS.sh, 该脚本包含了实践所需的全部命令, 在运行实践案例之前,使用 free 和 numactl 命令查看当前内存信息,接着运行脚本,可以看到脚本创建了一个 CXL REGION,并将 CXL REGION 的模式设置为 SYSTEM-RAM 模式,接着可以看到实践案例从 CXL REGION 的内存里读到数据,并打印了物理页所在的 ZONE 信息. 最后通过 free 和 numactl 命令可以看到系统物理内存数量增加,并且新增加了一个 NUMA NODE. 接下来查看一下实践案例源码:
实践案例由一个应用程序构成,其在 25 行打开 “/mnt/DAX/BiscuitOS.txt” 文件,然后在 30 行调用 mmap 函数分配一段虚拟内存映射文件,接着在 39-40 行对虚拟内存进行读写访问,最后在 43 行释放内存. 对 CXL REGION FSDAX 模式的使用无需进行定制修改,以上便是 CXL REGION FSDAX 模式在用户态的使用方法.