본문으로 건너뛰기
Bootloader Internals · 36/37

부트 시 메모리 토폴로지 결정 — DDR + CXL.mem 통합 인식

· Hawk · 9분 읽기

#한 줄 요약

“현세대 서버의 메모리는 4가지 이상의 다른 영역하나의 SPA 공간으로 통합됩니다.” — DDR DIMM·HBM·CXL.mem·Persistent memory가 각각 다른 지연·대역폭·persistence를 가지지만, 부트로더가 SRAT·HMAT·SLIT을 정교하게 채워 두면 커널이 자동으로 tier 분류·NUMA 노드 매핑을 합니다. 이게 시리즈의 마무리입니다.

Ch 34에서 PCIe enumeration, Ch 35에서 UEFI의 CEDT 생성을 봤습니다. 이 마지막 장은 전체 메모리 토폴로지어떻게 통합 인식되는지를 정리하면서 Bootloader Internals 시리즈를 마무리합니다.

#메모리 토폴로지의 4가지 구성

현세대 서버는 최소 4가지 메모리 영역을 동시에 갖습니다.

Tier대표지연대역폭persistence
HBM on-packageXeon Max·Genoa-X100~150 ns1 TB/s+volatile
DDR DIMMper-socket80~120 ns80~100 GB/svolatile
CXL.memper-card200~400 ns30~120 GB/svolatile or persistent
Persistent memoryNVDIMM, CXL persistent100~300 ns5~20 GB/spersistent

부트로더의 책임은 이 모든 영역을 식별하고 적절한 ACPI 테이블통합 표현하는 것.

#부트로더의 책임 분해

전체 흐름을 부트로더가 담당하는 단계로 나누면:

단계작업
1DRAM controller 초기화 (Ch 9)
2DDR DIMM size·channel 검출
3HBM detected check (CPU의 on-package)
4PCIe enumeration (Ch 34)
5CXL DVSEC scan (Ch 35)
6CXL HDM Decoder 프로그래밍
7Persistent memory firmware namespace 인식
8ACPI 테이블 (SRAT·HMAT·SLIT·MCFG·CEDT·NFIT) 생성
9Memory map E820/EFI 작성
10커널 인계

각 단계가 순서대로 정확해야 커널이 일관된 메모리 view를 갖습니다.

#SRAT — System Resource Affinity Table

SRATNUMA 노드와 메모리·CPU의 affinity를 정의합니다.

항목내용
Processor Local APIC/SAPIC AffinityCPU와 노드 매핑
Memory Affinitymemory range와 노드 매핑
Processor Local x2APIC Affinityx2APIC 환경
GIC ITS AffinityARM GICv3 ITS
Generic Initiator AffinityCXL device 등

CXL.mem은 Generic Initiator Affinity 또는 Memory Affinity로 등록되어 별도 NUMA 노드가 됩니다.

[SRAT Memory Affinity 예시]
Affinity 0: range 0x0 ~ 0x80000000, proximity domain 0 (socket 0 DDR)
Affinity 1: range 0x80000000 ~ 0x100000000, proximity domain 1 (socket 1 DDR)
Affinity 2: range 0x100000000 ~ 0x180000000, proximity domain 2 (CXL.mem)
Affinity 3: range 0x180000000 ~ 0x200000000, proximity domain 3 (HBM on-package)

#HMAT — Heterogeneous Memory Attribute Table

HMAT각 메모리 영역의 성능 특성을 정의합니다. Tiered memory의 핵심.

Subtable내용
Memory Subsystem Address Range Structure (MSARS)어느 SPA range가 어느 proximity domain
System Locality Latency·Bandwidth Information Structure (SLLBI)initiator → target의 latency·bandwidth
Memory Side Cache Information Structure (MSCIS)memory side cache (드물게 사용)

핵심은 SLLBI. 읽기·쓰기·access pattern별로 latency·bandwidth를 매트릭스 형태로 정의:

[HMAT SLLBI 매트릭스 예시 — Read Latency (ns)]
Target → DDR0 DDR1 CXL HBM
Initiator
CPU0 100 140 240 90
CPU1 140 100 240 180
CXL device 240 240 180 —

커널이 HMAT를 자동 파싱각 노드를 hot/cold tier로 분류. DAMON의 자동 promotion/demotion이 정보 기반.

#SLIT — System Locality Information Table

SLITNUMA 노드 간 distance matrix를 정의합니다.

Distance의미
10local (자기 노드)
20~30same socket (UPI/NVLink 가까움)
40~50cross-socket (UPI 1 hop)
50~80CXL local
100+CXL multi-hop
[SLIT distance 매트릭스 예시]
node: 0 1 2 3
0: 10 21 50 17 # socket 0
1: 21 10 50 35 # socket 1
2: 50 50 10 60 # CXL.mem
3: 17 35 60 10 # HBM on-package socket 0

이 distance가 NUMA balancer의 page migration 결정에 직접 사용됩니다.

#메모리 분류 의사 결정

부트로더는 각 메모리 영역을 어떤 ZONE으로 노출할지 결정합니다.

분류의미적용
Conventional / System RAM일반 kernel allocatorDDR, 일부 CXL
Movable Zonehot-remove 가능CXL.mem (default)
Reserved부트로더·펌웨어 전용EFI Memory Map의 일부
ACPI NVSACPI 데이터 영역작음
PersistentNVDIMM·CXL persistentmmap-only
Device DAXbyte-addressable, mmap-onlyCXL DAX 모드

CXL.mem을 Movable로 노출하면 hot-remove 가능. System RAM으로 노출하면 일반 메모리처럼 사용하지만 hot-remove 어려움.

#Tiered Memory 자동 인식 흐름

부트 → 커널 → 운영의 전체 흐름:

단계동작
1부트로더가 SRAT·HMAT·SLIT 생성
2커널이 NUMA 노드 등록
3커널이 HMAT bandwidth 기준으로 memory tier 자동 분류
4/sys/devices/virtual/memory_tiering/에 tier 정보 노출
5DAMON이 tier 정보 활용promotion/demotion 결정
6NUMA balancing이 추가 보조

운영 검증:

Terminal window
$ numactl --hardware
node distances:
node 0 1 2
0: 10 21 50
1: 21 10 50
2: 50 50 10
$ dmesg | grep -i "hmat\|memory_tier"
ACPI: HMAT: Memory Latency: 100ns at node 0
ACPI: HMAT: Memory Latency: 240ns at node 2
memory_tier: assigned tier 0 (DDR) to node 0
memory_tier: assigned tier 0 (DDR) to node 1
memory_tier: assigned tier 1 (CXL) to node 2
$ ls /sys/devices/virtual/memory_tiering/
memory_tier0/ memory_tier1/
$ cat /sys/devices/virtual/memory_tiering/memory_tier0/nodelist
0,1
$ cat /sys/devices/virtual/memory_tiering/memory_tier1/nodelist
2

#부트 시점 vs 런타임 결정

무엇이 부트 시점에 결정되고 무엇이 런타임인지 구분 중요:

항목시점
메모리 size·position부트
NUMA distance부트
Tier 분류부트 (HMAT 기반) + 런타임 (DAMON 보조)
Page placement런타임 (NUMA balance·DAMOS)
Hot-add CXL device런타임
Region 생성·commitfirmware-managed면 부트, user면 런타임

부트 시점 결정은 변경 불가. 잘못 설정하면 reboot만이 답.

#CXL Fabric의 부트 인식 한계

CXL 3.0 fabric의 동적 pooling부트 시점에 완전히 인식 불가합니다.

부트로더는:

  • 정적으로 할당된 영역: SRAT·HMAT에 포함
  • 동적 영역: CFMWS에 예약된 window로 표시
  • 런타임에는 Fabric Manager가 OS에 hot-add 알림

2단계 발견 모델fabric의 표준 흐름입니다.

#실 운영 예 — Granite Rapids + Astera Leo

가상 시나리오 (현장 일반화):

Terminal window
# 부팅 후 numactl 출력
$ numactl --hardware
available: 3 nodes (0-2)
node 0 cpus: 0-63
node 0 size: 256000 MB # socket 0 DDR
node 1 cpus: 64-127
node 1 size: 256000 MB # socket 1 DDR
node 2 cpus:
node 2 size: 2097152 MB # CXL.mem 2 TB
node distances:
node 0 1 2
0: 10 21 60
1: 21 10 60
2: 60 60 10
# HMAT 확인
$ dmesg | grep -i hmat
ACPI: HMAT: Memory Latency: 100ns, Bandwidth: 96000MB/s at node 0
ACPI: HMAT: Memory Latency: 100ns, Bandwidth: 96000MB/s at node 1
ACPI: HMAT: Memory Latency: 280ns, Bandwidth: 56000MB/s at node 2 # CXL
# Memory tier 분류
$ cat /sys/devices/virtual/memory_tiering/memory_tier*/nodelist
0,1
2

노드 2 (CXL)가 자동으로 tier 1로 분류되어 DAMON·NUMA balancecold page를 자동 이동.

#자주 하는 실수

#SRAT에 CXL.mem 누락

[증상]
guest$ numactl --hardware
available: 2 nodes (0-1) # CXL 노드 안 보임
# 그러나 lspci에는 디바이스 존재
guest$ lspci | grep CXL
5e:00.0 ... CXL Memory Device
# 메모리는 node 0의 일부로 잘못 인식

BIOS의 CXL 활성화 옵션이 disabled 또는 EDK II에 CXL 모듈 누락. BIOS update가 답.

#HMAT 누락 → tier 자동 분류 실패

[증상]
guest$ ls /sys/devices/virtual/memory_tiering/
# 비어 있음
guest$ dmesg | grep hmat
# 출력 없음

HMAT가 없으면 모든 노드를 single tier로 가정. DAMON promotion/demotion 동작 안 함. 수동 tiering 구성이 답이지만 근본 해결은 BIOS 수정.

#SLIT distance 잘못 → 역방향 promotion

[증상]
node distances:
node 0 1 2
0: 10 21 20 # CXL.mem이 cross-socket보다 가까움 (잘못)
1: 21 10 20
2: 20 20 10

distance가 틀리면 NUMA balancer가 CXL.mem을 hot으로 잘못 판단. 성능이 떨어지는 노드로 page promote가 일어남.

#Memory map 영역 충돌

[부팅 로그]
EFI: Memory Map: range 0x100000000-0x180000000 conflicting
EFI: dropping CXL region overlap

UEFI Memory Map과 CFMWS·SRAT의 range가 겹치면 일부 영역이 사라집니다. BIOS의 memory map 계산 오류. 보통 BIOS bug.

#Firmware-managed mode에서 user commit 시도

Terminal window
$ cxl create-region -d decoder0.0 -t ram -s 128G
Error: decoder firmware-locked

BIOS가 모든 HDM을 미리 commit했고 user의 추가 commit이 불가. BIOS 옵션에서 user-managed mode로 전환해야.

#정리

  • 현세대 서버 메모리는 HBM·DDR·CXL.mem·persistent4가지 이상 영역한 SPA 공간으로 통합됩니다.
  • 부트로더는 SRAT·HMAT·SLIT·CEDT·NFIT정교하게 채워 커널이 자동으로 NUMA·tier 분류하게 합니다.
  • HMAT의 latency·bandwidth 정보memory tier 자동 분류의 근거. DAMON·NUMA balancing이 그 정보 기반.
  • Firmware-managed vs user-managed HDM mode는 부트 시점 vs 런타임 결정 분기.
  • CXL Fabric의 동적 영역부트 시점에 예약되고 런타임에 hot-add. 2단계 발견 모델.
  • 흔한 실수는 SRAT/HMAT 누락·distance 잘못·memory map 충돌·mode 충돌 5가지.

#시리즈 마무리 — Bootloader Internals 36편 회고

본 시리즈는 전원 인가 직후의 0 명령어에서 시작해 복잡한 multi-tier 메모리 토폴로지까지 부트로더의 전체 책임을 다뤘습니다.

Part챕터핵심
도입 (Ch 1)부트의 빈자리왜 부트로더가 필요한가
U-Boot 기초 (Ch 2~14)빌드·구조·드라이버·페리페럴U-Boot 내부
보안·통합 (Ch 15~20)FIT·verified boot·A/B·EFI·RAUC양산 보안
실전 (Ch 21~30)porting·debugging·BootROM·TF-A·CI양산 운영
확장 (Ch 31~33)TF-A BL31·PSCI·SMPARM64 깊이
CXL 통합 (Ch 34~36)PCIe enum·UEFI CXL·메모리 토폴로지데이터센터

CXL 통합 챕터(34~36)는 임베디드 부트로더가 데이터센터 서버까지 확장되는 흐름을 보여 줍니다.

다음 깊이는 기존 다른 시리즈분산 추가된 챕터로 자연 연결:

#관련 항목

Bootloader Internals · 36 of 37

  1. 1ROM부터 init까지 — 임베디드 부팅 단계의 빈자리 분석
  2. 2Das U-Boot vs TF-A vs EDK II — 임베디드 부트로더 생태계 비교
  3. 3U-Boot 빌드 시스템 분석 — Kconfig·Makefile·defconfig 동작 추적
  4. 4ARM 임베디드 부트 4단계 분해 — BL1·SPL·TPL·U-Boot Proper의 역할
  5. 5U-Boot Falcon Mode — SPL이 U-Boot Proper 없이 커널 직접 부팅
  6. 6Device Tree DTB 부트로더 처리 — 로딩 시점과 fixup 메커니즘 추적
  7. 7U-Boot Driver Model 내부 — uclass·driver·device 추상화 구조
  8. 8U-Boot 보드 초기화 시퀀스 — board_init_f와 board_init_r 분리 이유
  9. 9DDR Controller 프로그래밍과 PHY Training — SPL의 가장 어려운 작업
  10. 10임베디드 스토리지 부팅 분석 — MMC·SCSI·NAND·SPI Flash 비교
  11. 11임베디드 네트워크 부팅 — TFTP·PXE·BOOTP 시퀀스 분석
  12. 12U-Boot USB 부팅 — fastboot·UMS·USB host 메커니즘
  13. 13U-Boot 환경 변수와 bootcmd — 부팅 시나리오 정의하기
  14. 14Modern U-Boot bootflow / bootmeth — 새 추상화 레이어 분석
  15. 15FIT image 구조 분석 — multi-image·hash·configuration 추적
  16. 16U-Boot Verified Boot — RSA 서명과 public key 임베딩 흐름
  17. 17임베디드 A/B 부팅 이중화 — OTA 안전성을 위한 부트 슬롯 설계
  18. 18U-Boot의 EFI 호환 분석 — bootefi 명령과 EFI loader 동작 원리
  19. 19Linux Boot ABI — ARM/ARM64 커널 진입 규약 추적
  20. 20임베디드 펌웨어 업데이트 — RAUC vs SWUpdate 비교
  21. 21새 보드 U-Boot 포팅 실전 — defconfig 작성부터 첫 부팅까지
  22. 22부트로더 디버깅 기법 — DEBUG·JTAG·serial·post-mortem 분석
  23. 23SoC BootROM·eFuse·OTP — 부팅의 0단계 분석
  24. 24SPL·TPL 내부 해부 — 가장 작은 부트 단계의 동작 추적
  25. 25ARM Trusted Firmware-A 통합 — BL1·BL2·BL31·BL32·BL33 흐름
  26. 26DDR Training과 PHY Calibration — 보드별 파라미터 튜닝
  27. 27임베디드 Chain of Trust — 다단계 서명 검증의 전체 흐름
  28. 28임베디드 Flash Layout 설계 — partition·NAND·eMMC·UBI 비교
  29. 29U-Boot Distro Boot — extlinux·boot.scr 표준화 분석
  30. 30부트로더 CI 구축 — build matrix와 자동 부팅 테스트
  31. 31TF-A BL31 EL3 Runtime 분석 — PSCI·SDEI·RAS dispatcher 추적
  32. 32PSCI와 SMCCC ABI — ARM 표준 SMC 호출 규약 분석
  33. 33ARM64 Secondary Core Bring-up — PSCI CPU_ON 호출부터 EL1 진입까지
  34. 34U-Boot PCIe Enumeration — 부트로더가 디바이스를 찾는 흐름 분석
  35. 35EFI·UEFI에서 CXL 초기화 — CEDT 생성과 HDM Decoder 사전 설정
  36. 36부트 시 메모리 토폴로지 결정 — DDR + CXL.mem 통합 인식
  37. 37UEFI Secure Boot 인증서 만료 — 2011→2023 CA 롤오버와 PQC 대비