1. CXL 硬件发现与拓扑识别

CXL 硬件发现与拓扑识别 学习卡片

任务说明

在 Linux 上确认 CXL 设备是否被内核枚举,并区分三类对象:主机桥(Host Bridge)、根端口(Root Port)、端点(Endpoint)。三者通过 PCIe 拓扑串联,最终在 /sys/bus/cxl/devices 下形成 CXL 设备树。本案例用 lspci、dmesg、sysfs 三条路径交叉验证,并输出物理拓扑。

环境与依赖

  • 内核需启用 CXL 支持:CONFIG_CXL_BUS=y、CONFIG_CXL_PCI=y(ACPI 平台还需 CONFIG_CXL_ACPI)。
  • 工具:pciutils(lspci)、dmesg、标准 coreutils。
  • 若为虚拟机/无 CXL 硬件,脚本会如实报告“未发现 CXL 设备”,不会伪造结果。

识别脚本

脚本按“PCI 层 → 内核日志 → CXL 子系统”顺序采集,最后按 root → port → endpoint 关系打印拓扑。CXL 设备在 PCI 配置空间中的类码为 0x0502(CXL Memory Controller),主机桥/根端口通常以 0x0600 桥类出现,因此用 lspci -nn 过滤 0502 与 0600 两类,再结合 sysfs 的 class 与 modalias 判定角色。

#!/usr/bin/env bash
# cxl_topology.sh —— 识别 CXL 主机桥 / 根端口 / 端点并打印拓扑
set -u

CXL_SYS=/sys/bus/cxl/devices
echo "== 1. PCI 层:CXL 相关设备 (lspci) =="
# 0502 = CXL Memory Controller, 0600 = Host bridge
lspci -nnD 2>/dev/null | grep -Ei '0502|0600' || echo "  (lspci 未发现 CXL/桥设备)"

echo
echo "== 2. 内核日志:CXL 枚举记录 (dmesg) =="
dmesg 2>/dev/null | grep -i cxl | tail -n 20 || echo "  (dmesg 无 CXL 记录或权限不足)"

echo
echo "== 3. CXL 子系统设备 (sysfs) =="
if [ ! -d "$CXL_SYS" ]; then
  echo "  $CXL_SYS 不存在:内核未启用 CXL 或未枚举到设备"
  exit 0
fi

# 读取每个 CXL 设备的角色与父设备
declare -A ROLE PARENT
for d in "$CXL_SYS"/*; do
  [ -e "$d" ] || continue
  name=$(basename "$d")
  # 角色由设备目录名前缀决定:root/port/endpoint/memdev 等
  case "$name" in
    root*)     role="host-bridge" ;;
    port*)     role="root-port"   ;;
    endpoint*) role="endpoint"    ;;
    *)         role="other"       ;;
  esac
  ROLE["$name"]="$role"
  # 物理父设备:CXL 设备通过 PCI 设备关联,读取其父 PCI 路径
  link=$(readlink -f "$d" 2>/dev/null)
  PARENT["$name"]="$link"
  printf "  %-14s role=%-12s path=%s\n" "$name" "$role" "$link"
done

echo
echo "== 4. 物理拓扑 (root -> port -> endpoint) =="
# 按角色分层打印,体现主机桥到端点的层级关系
for name in "${!ROLE[@]}"; do
  [ "${ROLE[$name]}" = "host-bridge" ] || continue
  echo "  [host-bridge] $name"
  for p in "${!ROLE[@]}"; do
    [ "${ROLE[$p]}" = "root-port" ] || continue
    echo "      └─ [root-port] $p"
    for e in "${!ROLE[@]}"; do
      [ "${ROLE[$e]}" = "endpoint" ] || continue
      echo "          └─ [endpoint] $e"
    done
  done
done

运行与验证

chmod +x cxl_topology.sh
sudo ./cxl_topology.sh

判定标准:

  • 第 1 节应列出类码 0502 的 CXL 内存控制器或 0600 桥设备;
  • 第 2 节出现 cxl 相关枚举日志(如 cxl_pci、cxl_acpi);
  • 第 3 节 /sys/bus/cxl/devices 下出现 root*、port*、endpoint* 目录;
  • 第 4 节按 host-bridge → root-port → endpoint 层级打印,与 sysfs 实际目录一致。

若第 3 节提示目录不存在,说明当前系统未枚举到 CXL 设备,属正常结果,需在具备 CXL 硬件的机器上复测。

拓扑关系示意

Host Bridge root* Root Port port* Endpoint endpoint* PCIe PCIe lspci 类码 0600 / 0502 dmesg: cxl_pci / cxl_acpi 枚举 sysfs: /sys/bus/cxl/devices/{root,port,endpoint}*