1. 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 硬件的机器上复测。