본문으로 건너뛰기
CXL 4.0 Internals · 12/15

Ch 12: QEMU CXL 에뮬레이션 — 노트북에서 CXL 개발

· Hawk · 5분 읽기

#한 줄 요약

“QEMU 8.0+가 CXL Type 3 디바이스 에뮬레이션을 stable 지원해 노트북에서 CXL 드라이버·BIOS 개발이 가능해졌습니다.”-machine q35,cxl=on 옵션과 pxb-cxl·cxl-rp·cxl-type3·memory-backend-file 조합으로 실 디바이스 없이 Linux guest가 CXL을 인식합니다. Latency 시뮬레이션은 부정확하지만 드라이버 prototype·BIOS 코드 검증에는 충분.

Ch 11에서 Linux drivers/cxl/ 코드를 봤습니다. 드라이버 개발·디버깅에는 실 디바이스 또는 에뮬레이션이 필요합니다. Astera Leo 카드가 수십~수백 만원이라 책상 위에서 시작하기엔 부담. QEMU가 그 갭을 채웁니다.

#QEMU CXL 지원 현황

QEMU 8.0+의 CXL 기능 매트릭스:

항목지원안정도
Type 3 memory expander8.0+stable
Type 2 accelerator + memory9.0+experimental
Type 1 cache-onlynot supported
Multi-LD pooling8.2+partial
CXL Switch8.2+basic
CXL 3.0 fabricnot yet

대부분 개발은 Type 3로 충분. 드라이버 pathType별로 크게 갈리지 않습니다.

#호스트 머신 모델

QEMU에 CXL host bridge를 자동 생성하는 옵션:

Terminal window
qemu-system-x86_64 \
-machine q35,cxl=on \
-m 8G,slots=8,maxmem=32G \
-smp 4 \
-enable-kvm \
...

핵심 옵션:

옵션의미
cxl=onCXL host bridge 자동 생성
slots=N,maxmem=Mhot-add 가능한 memory 슬롯
q35PCIe support machine (i440fx 안 됨)

-machine이 켜져야 CEDT가 자동 생성되어 Linux guest가 CXL 인식.

#CXL Type 3 디바이스 추가

전체 옵션 조합:

Terminal window
qemu-system-x86_64 \
-machine q35,cxl=on \
-m 8G,slots=8,maxmem=32G \
\
-object memory-backend-file,id=cxl-mem0,share=on,\
mem-path=./cxl-mem-backing,size=256M \
\
-device pxb-cxl,bus_nr=12,bus=pcie.0,id=cxl.1 \
-device cxl-rp,port=0,bus=cxl.1,id=root_port0,\
chassis=0,slot=0 \
-device cxl-type3,bus=root_port0,memdev=cxl-mem0,\
id=cxl-mem0-dev \
\
-M cxl-fmw.0.targets.0=cxl.1,cxl-fmw.0.size=512M

각 옵션 의미:

옵션역할
memory-backend-file실 파일이 CXL device의 backing store
pxb-cxlCXL host bridge (PCI Expander Bus, CXL flavor)
cxl-rpCXL Root Port
cxl-type3Type 3 디바이스 자체
cxl-fmwFixed Memory Window (CFMWS entry)

FMW size디바이스 자체 메모리보다 커야. multiple device interleave를 위한 예약 영역.

#Linux Guest의 인식 흐름

QEMU 안에서 부팅한 Linux:

Terminal window
# 커널 6.0+이어야 CXL 서브시스템 동작
guest$ uname -r
6.8.0-...
# CXL 모듈 로딩
guest$ modprobe cxl_acpi
guest$ modprobe cxl_pci
# PCIe로 보임
guest$ lspci -nn | grep CXL
0c:00.0 CXL: ... [1af4:0d93] # virtio vendor + CXL ID
# CXL sysfs 등록 확인
guest$ ls /sys/bus/cxl/devices/
mem0/ decoder0.0/ port0/ root0/
# 토폴로지
guest$ cxl list -RT
[
{
"root":"root0",
"decoders":[
{
"decoder":"decoder0.0",
"size":536870912
}
],
"endpoints":[
{
"memdev":"mem0",
"ram_size":268435456
}
]
}
]
# Region 생성
guest$ cxl create-region -d decoder0.0 -t ram -s 256M
{
"region":"region0",
"size":268435456,
"decoder":"decoder0.0"
}
# DAX 모드 또는 system RAM 모드
guest$ daxctl reconfigure-device dax0.0 -m system-ram
# numactl로 CXL 노드 확인
guest$ numactl --hardware
node 0 size: 8000 MB # 기본 RAM
node 1 size: 256 MB # CXL Type 3 expander

guest 안에서 모든 명령이 실 디바이스와 동일하게 동작합니다.

#CEDT 검증

QEMU가 자동 생성한 ACPI CEDT 확인:

Terminal window
guest$ acpidump -b
guest$ iasl -d cedt.dat
# cedt.dsl 파일 내용
[001h] Signature "CEDT"
[004h] Table Length 0x0000005C
[008h] Revision 0x01
[009h] Checksum 0x...
[Subtable Type: CHBS (CXL Host Bridge Structure)]
[001h] Subtable Type 0x00
[003h] UID 0x0000
[007h] CXL Version 0x0001
[00Bh] Base 0x...
[013h] Length 0x...
[Subtable Type: CFMWS (CXL Fixed Memory Window)]
[001h] Subtable Type 0x01
...

CEDT 내용이 실 BIOS와 동일한 형식입니다. 드라이버가 같은 path로 인식.

#드라이버 개발 워크플로

QEMU 환경에서 kernel module 개발 사이클:

Terminal window
# host에서 cross-compile
host$ make ARCH=x86_64 CROSS_COMPILE=x86_64-linux-gnu- \
M=drivers/cxl/
# 결과 .ko를 guest로 복사
host$ scp drivers/cxl/cxl_mock.ko guest:/tmp/
# guest에서 load·테스트
guest$ insmod /tmp/cxl_mock.ko
guest$ dmesg | tail
guest$ ls /sys/bus/cxl/devices/
# 수정·반복
host$ vim drivers/cxl/cxl_mock.c
host$ make ...

컴파일·load·테스트 사이클이 수십 초. 실 하드웨어에 reboot·flash하는 시간보다 훨씬 빠름.

#QEMU CXL의 한계

QEMU CXL은 정확도가 떨어지는 영역:

한계영향
latency 시뮬레이션 미정확성능 측정에 못 씀
실 PCIe link 없음PHY·LTSSM 버그 못 잡음
CXL.cache 미지원 (Type 2)accelerator coherency 검증 한계
Fabric·switch 시뮬레이션 제한대규모 토폴로지 못 봄
RAS·MCTP·VDM 미구현운영 시나리오 검증 한계

적합한 사용:

  • 드라이버 prototype·디버깅
  • Kernel module ABI 변경 검증
  • BIOS·UEFI CXL 코드 개발
  • userland tool (cxl-cli 등) 개발
  • 회귀 테스트

부적합:

  • 성능 측정·튜닝
  • 실 하드웨어 호환성 검증
  • PHY·signal integrity 디버깅

#대체 도구

QEMU 외 대안:

도구정확도속도용도
QEMU CXLmediumfast드라이버·BIOS 개발
Intel/AMD referencehighslow정밀 시뮬레이션
gem5 CXL 모델very highvery slow아키텍처 연구
FPGA 보드 + CXL IPexacthardware양산 검증

대부분 개발자는 QEMU + FPGA 보드 조합비용·정확도 균형입니다.

#QEMU 4.0 spec 지원

CXL 4.0 Bundled Port·128 GT/s·Streamlined Port 같은 새 기능QEMU 진행 중:

기능QEMU 상태 (대략)
128 GT/s 시뮬레이션latency model만 (실 신호 없음)
Bundled Port실험 단계
Streamlined Port미지원
Host-initiated PPR미지원

대부분 4.0 기능 개발QEMU patch 직접 작성 후 test하는 방식. Mainline 합류는 시간 걸림.

#자주 하는 실수

#q35 머신 안 쓰고 i440fx로 시도

Terminal window
$ qemu-system-x86_64 -machine pc,cxl=on ...
qemu-system-x86_64: warning: cxl option requires q35 machine

CXL은 PCIe 5.0 기반. PCIe 자체q35 머신만 지원. 옛 머신 모델로는 CXL이 동작 안 합니다.

#Backing file 권한 잘못

Terminal window
$ qemu-system-x86_64 \
-object memory-backend-file,id=mem0,\
mem-path=/root/cxl-mem,...
# guest 시작 시 segfault — 권한 거부

QEMU 프로세스가 읽기·쓰기 권한. /tmp/ 또는 sudo 환경.

#Guest kernel 5.x 사용

Terminal window
guest$ uname -r
5.15.0-...
guest$ modprobe cxl_acpi
modprobe: FATAL: Module cxl_acpi not found

CXL subsystem은 6.0+ mainline. 5.15 LTS는 OEM patch 없이는 동작 안 함. Ubuntu 24.04+ 또는 Fedora 38+ 권장.

#FMW size를 device size와 같게

Terminal window
-object memory-backend-file,...,size=256M
-M cxl-fmw.0.size=256M # 같으면 interleave 영역 없음

FMW는 interleave를 위한 예약 영역도 포함해야. device size의 2배 이상 권장.

#Multi-device emulation 시 chassis·slot 충돌

Terminal window
-device cxl-rp,port=0,...,chassis=0,slot=0
-device cxl-rp,port=1,...,chassis=0,slot=0 # 충돌!

각 root port는 고유 (chassis, slot). slot을 1, 2, 3… 로 증가.

#정리

  • QEMU 8.0+가 CXL Type 3 디바이스 에뮬레이션을 stable 지원해 드라이버·BIOS 개발노트북에서 가능하게 합니다.
  • -machine q35,cxl=on이 기본. pxb-cxl·cxl-rp·cxl-type3·memory-backend-file을 조합해 디바이스 추가.
  • Linux guest는 *kernel 6.0+*에서 cxl_acpi·cxl_pci·cxl_mem 자동 인식. cxl list -RT로 토폴로지 확인.
  • latency·신호 무결성·CXL.cache 시뮬레이션은 한계. 성능 측정·PHY 디버깅은 실 HW 필요.
  • 컴파일·load·테스트 사이클이 수십 초드라이버 prototype에 이상적.

#다음 편

Ch 13: Switching·Fabric Manager — 2.0 pooling에서 3.x fabric까지에서 CXL switch의 진화Fabric Manager의 역할을 본격적으로 분해합니다.

#관련 항목

#시리즈 자료 출처 안내

본 글은 QEMU 공식 문서 (GPL)·QEMU 소스·Linux drivers/cxl/ 소스를 1차 자료로 합니다. CXL 4.0 Specification은 § navigation aid로만 인용. 자세한 spec 인용 정책은 Ch 1 footer 참고.