← ARMv9 길잡이DUJINLABS.COM

KVM · GIC · SMMU · Firmware · PMU · CoreSight · RAS

ARMv9 가상화·플랫폼·성능 관측

CPU instruction set만으로 시스템은 완성되지 않는다. hypervisor 실행 mode, interrupt와 DMA remapping, firmware interface, 서버 표준, trace와 오류 보고가 Linux에서 만나는 경계를 한 지도에 놓는다.

Virtualization
VHE · nVHE · NV
Platform
GIC · SMMU · TF-A
Observability
PMU · SPE · BRBE · ETE
Checked
2026-08-07 KST

컴퓨터 한 대를 여러 컴퓨터처럼 나누는 법

가상머신은 CPU·memory·interrupt·장치를 여러 운영체제가 나눠 쓰게 한다. 각 guest는 자신이 실제 machine을 가진 것처럼 보지만, EL2의 hypervisor가 guest의 주소를 실제 주소로 바꾸고 위험한 동작을 가로챈다.

CPU 시간

host scheduler가 어느 vCPU를 어느 physical CPU에서 얼마나 실행할지 정한다.

Memory

guest page table의 VA→IPA 변환 뒤에 EL2 Stage 2의 IPA→PA 변환을 한 번 더 적용한다.

Interrupt

GIC가 실제 device interrupt를 host에 전달하고, KVM이 guest가 볼 virtual interrupt로 연결한다.

DMA

SMMU가 장치의 address를 변환해 장치가 자기 VM에 허용된 memory만 읽고 쓰게 한다.

VHE, GICv4, HDBSS 같은 기능은 이 기본 구조를 바꾸기보다 자주 일어나는 전환·interrupt 주입·dirty-page 기록을 hardware가 더 직접 처리해 overhead를 줄인다.

VHE, nVHE와 nested virtualization

ARMv8.1부터 VHE(Virtualization Host Extensions)는 host kernel이 EL2에서 효율적으로 실행되도록 EL1과 유사한 register view를 제공한다. nVHE에서는 host Linux가 EL1, KVM의 작은 hyp component가 EL2에 분리된다. protected KVM은 이 분리를 host 자체로부터 guest를 보호하는 방향에도 활용한다.

형태Host 위치특징주요 경계
VHE대부분 EL2host와 hyp 전환 비용을 줄이고 kernel 실행을 단순화host와 hypervisor가 같은 큰 신뢰 영역에 가깝다.
nVHEhost EL1 + hyp EL2별도 hyp page table과 context를 사용EL1 host와 EL2 code/data 경계를 명시해야 한다.
NestedL0가 L1 hypervisor를 guest로 실행virtual EL2, Stage 2 합성과 trap forwarding 필요L0·L1·L2의 VMID, timer, interrupt와 fault ownership이 복잡하다.

Fine-grained trap은 system register나 기능군 전체를 과도하게 trap하지 않고 필요한 동작만 EL2로 가져온다. 성능 최적화인 동시에 guest에 노출할 architecture surface를 제어하는 보안 경계다.

실제 Linux 코드는 KVM virtualization 비교에서 VHE/nVHE entry, Stage 2와 VM exit까지 이어진다.

Arm 가상화 입문 문서에 따르면 VHE의 대표 제어는 HCR_EL2.E2HTGE다. E2H=1은 EL2 host용 register view를 사용하고, TGE=1은 host EL0의 일반 예외를 EL2 host kernel 쪽으로 routing하는 데 사용된다.

Guest instruction 하나가 KVM을 만나는 과정

일반 계산 명령은 hypervisor 도움 없이 CPU에서 직접 실행된다. 그래야 VM이 빠르다. EL2가 개입하는 때는 guest가 허용되지 않은 system register를 만지거나, Stage 2에 없는 memory를 접근하거나, interrupt·timer·device emulation이 필요할 때다.

vCPU 실행과 exit

QEMU / VMM userspace
    KVM_RUN ioctl
        ↓
Linux KVM
    guest general registers, timer, virtual GIC state 준비
        ↓
EL2 entry code
    VTTBR_EL2=guest Stage-2 root, HCR_EL2=trap policy
    ERET → guest EL1/EL0
        ↓
guest가 일반 ADD/LDR 실행 ── 성공하면 계속 직접 실행
guest가 emulated MMIO 접근 ── Stage-2 fault → EL2 exit
        ↓
ESR_EL2/FAR_EL2/HPFAR_EL2를 해석
kernel 또는 QEMU가 device 동작을 emulation한 뒤 재진입

ESR_EL2는 exception class와 세부 원인, FAR_EL2는 fault address, Stage 2 fault에서는 HPFAR_EL2가 IPA 재구성에 필요한 정보를 제공한다.

모든 system register를 trap하면 VM이 느려진다. 반대로 너무 많이 직접 허용하면 host 자원이나 다른 VM을 건드릴 수 있다. Fine-grained trap은 PMU·trace·cache 제어 같은 기능에서 필요한 register만 골라 trap해 이 절충을 세밀하게 한다.

Nested virtualization의 한 단계 추가

L0 hypervisor가 L1 hypervisor를 guest로 실행하고, L1이 다시 L2 guest를 실행한다. L2의 memory 접근은 L1이 만든 “가상 Stage 2”와 L0의 실제 Stage 2를 모두 만족해야 한다. L0는 두 translation을 합성해 hardware가 사용할 shadow 또는 combined mapping을 만들고, L1이 table을 바꾸면 관련 TLB를 다시 무효화한다.

HDBSS와 live migration

Hardware Dirty Bit management는 Stage 2 page가 guest에 의해 쓰였음을 hardware가 기록해 hypervisor의 write-protection fault 비용을 줄인다. HDBSS(Hardware Dirty Bit State Structure)는 dirty 상태 수집을 더 효율적으로 만들어 migration 반복 copy 단계의 관측 비용을 낮춘다.

  1. migration 시작 전에 dirty logging capability와 Stage 2 page size 조합을 협상한다.
  2. hardware가 갱신한 dirty state와 CPU cache·TLB ordering을 올바른 barrier로 수집한다.
  3. device DMA가 만든 변경도 추적되는지 IOMMU dirty logging 경계를 따로 확인한다.
  4. 마지막 stop-and-copy에서 vCPU register, interrupt controller와 timer state를 함께 일관되게 옮긴다.

GICv3부터 GICv5까지

세대·구성핵심 역할ARMv9 시스템에서 볼 점
GICv3Distributor, Redistributor와 system-register CPU interfaceSPI·PPI·SGI routing, affinity와 virtualization interface의 기본.
ITSPCIe MSI/MSI-X 같은 LPI의 translation·collectiondevice ID, event ID와 vCPU affinity migration을 연결.
GICv4.xvirtual interrupt의 직접 주입과 doorbell 개선VM exit 감소와 vPE scheduling 경계를 확인.
NMI일반 interrupt masking보다 높은 우선순위의 비차단 경로watchdog·debug·RAS 경로가 실제 kernel에서 활성화됐는지 확인.
GICv5v9.7 세대의 차세대 interrupt architecture 방향architecture 발표와 실제 component·kernel 지원 시점을 구분.

interrupt controller 비교에서 GIC의 IRQ entry와 Linux irqdomain까지 이어진다.

Network packet interrupt가 VM까지 가는 과정

물리 interrupt에서 virtual interrupt까지
NICMSI/MSI-X 발생
ITSDeviceID+EventID를 LPI로 변환
Redistributor대상 PE·vPE 선택
KVM / GIC virtguest virtual IRQ pending
Guestvirtual CPU interface에서 IRQ 수신

GICv3의 기본 가상화에서는 physical interrupt가 host를 깨우고 KVM이 virtual list register에 guest interrupt를 넣을 수 있다. GICv4 계열의 direct injection은 ITS와 vPE 정보를 이용해 일부 interrupt를 running guest에 더 직접 전달해 host exit를 줄인다.

vCPU가 다른 PE로 migration되면 pending interrupt와 vPE affinity도 옮겨야 한다. “interrupt 번호만 같은 CPU로 보내면 된다”가 아니라 ITS collection, Redistributor, virtual CPU interface와 guest의 acknowledge/end-of-interrupt 상태가 일관돼야 한다.

SMMUv3는 장치의 Stage 1·2를 관리한다

SMMU는 device DMA address를 PA로 변환하고 stream별 접근을 격리한다. PCIe PASID와 유사한 substream, command/event queue, ATS와 PRI 같은 기능은 장치와 CPU page table의 연결을 확장한다.

Stream ownership

어느 device·queue가 어느 domain과 PAS에 속하는지 reset·hotplug까지 유지한다.

Translation

device Stage 1과 Stage 2, shared virtual addressing 또는 guest assignment 조합을 구분한다.

Invalidation

CPU page table, SMMU TLB, device ATS cache를 모두 필요한 순서로 무효화한다.

Realm assignment

RME device assignment는 SMMU와 PAS, memory encryption context, interrupt routing을 Realm lifecycle에 묶는다.

DMA/IOMMU 비교에서 map/unmap, IOTLB와 cache coherency를 확인한다.

장치가 VM memory를 읽는 주소 변환

CPU는 instruction의 load/store를 MMU로 변환하지만, NIC·GPU·accelerator는 CPU 명령 없이 스스로 memory를 읽고 쓴다. SMMU가 없다면 잘못되거나 악성인 장치가 임의의 DRAM을 DMA할 수 있다.

SMMUv3 처리 순서

Device DMA request
    address=IOVA 0x4000, StreamID=0x52, optional SubstreamID
        ↓
SMMU Stream Table Entry[0x52]
    이 stream의 translation·fault·bypass 정책 선택
        ↓
Stage 1: IOVA → IPA/PA        (process/device address space)
Stage 2: IPA  → PA           (VM ownership 경계)
        ↓
permission·memory attribute 검사 후 DRAM 접근
실패하면 Event Queue에 fault record, 성공하면 IOTLB에 cache

host가 mapping을 지울 때 page table만 바꾸면 SMMU IOTLB와 장치 ATS cache에 이전 주소가 남을 수 있다. Command Queue로 invalidation을 보내고 완료를 기다린 뒤 physical page를 다른 소유자에게 반환해야 한다.

식별자쉬운 의미격리 단위
StreamID어느 장치 또는 requester에서 온 DMA인가Stream Table Entry와 translation domain 선택.
SubstreamID / PASID한 장치 안의 어느 process·queue인가shared virtual addressing과 세분화된 process 격리.
VMID어느 VM의 Stage 2인가같은 IPA를 쓰는 여러 VM의 IOTLB entry 구분.

Realm device assignment는 이 translation에 GPT/PAS, device reset, interrupt, firmware 측정까지 더한다. SMMU mapping만 Realm PA로 향하게 한다고 안전한 할당이 완성되지는 않는다.

PSCI, SMCCC, FF-A와 Trusted Firmware-A

규격·구현담당 계약Linux에서 보이는 위치
SMCCCSMC/HVC 호출 convention, register 인자와 반환 형식firmware·hypervisor service 호출의 공통 운반 규칙.
PSCICPU on/off, suspend, system reset·power stateCPU hotplug, cpuidle, reboot와 suspend backend.
FF-ANormal World와 Secure partition 사이 message·memory sharingTEE·secure service와 memory transaction driver.
TF-AEL3 runtime firmware와 PSCI·SMCCC 등 reference implementationSoC firmware log와 platform port에서 실제 지원 확인.

구분: PSCI는 power-management API, SMCCC는 호출 convention, FF-A는 partition 통신 protocol, TF-A는 이들 일부를 구현하는 software다. 서로 같은 층이 아니다.

전원을 켠 뒤 Linux와 보조 CPU가 올라오는 과정

  1. Reset: boot CPU가 platform이 정한 최고 EL에서 시작하고 Root/Secure firmware가 memory·GIC·security state의 초기 경계를 만든다.
  2. EL3 firmware: TF-A 같은 firmware가 PSCI runtime service와 World 전환 entry를 준비한다.
  3. Boot firmware: UEFI가 device를 발견하고 ACPI/Device Tree를 준비해 Linux Image를 실행한다.
  4. Linux boot CPU: kernel이 exception vector, MMU, GIC, timer와 scheduler를 초기화한다.
  5. Secondary CPU: Linux가 SMCCC 규칙에 맞춰 PSCI_CPU_ON을 호출하고 대상 MPIDR와 entry PA를 전달한다.
  6. Firmware release: platform power controller를 조작한 뒤 보조 CPU가 kernel secondary entry에서 시작해 online 상태가 된다.

SMCCC는 x0의 function ID와 x1..x7 인자·반환 register 같은 호출 형식을 정하고, PSCI는 그 형식 위에서 CPU_ON·CPU_SUSPEND·SYSTEM_RESET의 의미를 정한다. 이 둘을 분리해서 보면 firmware log와 kernel 오류를 어느 층에서 추적해야 하는지 알 수 있다.

BSA, SBSA, BBR과 firmware description

서버·범용 플랫폼은 CPU ISA만 맞는다고 OS가 부팅되는 것이 아니다. BSA는 기본 hardware system architecture, SBSA는 서버에 필요한 계층별 hardware 요구사항, BBR은 boot·firmware interface 요구를 정의한다.

BSA

Base System Architecture

interrupt, timer, PCIe, watchdog 등 OS가 기대할 hardware 기반을 정한다.

SBSA

Server Base System Architecture

서버 class와 level에 맞춰 확장성·RAS·virtualization 요구를 구체화한다.

BBR

Base Boot Requirements

UEFI, ACPI와 SMBIOS 등 OS boot·discoverability 계약을 정의한다.

ACPI는 firmware가 table로 정적인 hardware 구성을 설명하고, Device Tree는 node·property로 hardware를 기술한다. UEFI는 boot service와 runtime service를 제공한다. Arm server는 보통 BBR에 맞춘 UEFI+ACPI를, embedded platform은 Device Tree를 많이 사용하지만 제품 요구가 최종 기준이다. Linux 문서는 arm64 ACPIbooting에 연결된다.

PMUv3와 AMU

PMUv3는 programmable event counter, cycle counter, overflow interrupt와 filtering을 제공하며 revision마다 counter 수·filter·snapshot·virtualization 기능이 확장된다. 그러나 CPU별 event 번호와 의미는 architecture event와 implementation-defined event를 분리해 core TRM에서 확인해야 한다.

PMU revision

ID_AA64DFR0_EL1 등 ID register와 kernel PMU driver가 인식한 revision을 확인한다.

Event map

architecture event는 공통 의미가 있지만 raw event는 Cortex·Neoverse TRM과 revision에 종속된다.

AMU

활성·상주 cycle과 주파수 관련 counter를 제공해 scheduler와 firmware가 capacity·frequency를 추정하도록 돕는다.

Virtualization

guest counter access, overflow와 filter state를 trap·emulate하거나 hardware assist로 제공한다.

SPE, BRBE, ETE, TRBE와 CoreSight

기능수집 정보buffer·virtualization 경계
SPEsampling된 instruction의 latency, memory address, cache·TLB 결과per-CPU buffer, filtering, address 노출과 guest ownership을 관리.
BRBE최근 branch source·target·type 기록context switch와 privilege filtering, 다른 task 기록 삭제 필요.
ETE정밀 instruction execution traceCoreSight path, trace ID와 sink bandwidth를 구성.
TRBEPE trace를 system memory ring buffer에 기록buffer wrap, interrupt, VM별 buffer 교체와 PA 보호가 핵심.
CoreSightsource·link·sink로 이루어진 system trace fabricfunnel, replicator, ETF/ETR와 debug authentication을 SoC 문서에서 확인.

v9.6 계열의 VM용 SPE/TRBE interface는 guest가 profiling을 사용할 때 host가 buffer와 context를 더 효율적으로 전환하도록 돕는다. 그래도 trace address는 민감 정보이므로 host·guest 권한과 sanitization 정책이 필요하다.

tracing/unwind 비교에서 Linux perf·ftrace와 architecture trace를 구분해 볼 수 있다.

“프로그램이 느리다”를 단계별로 좁히는 법

PMU counter 하나만 보고 원인을 단정하지 않는다. 먼저 실행 시간이 CPU 계산, memory 대기, branch miss, lock 대기 또는 I/O 중 어디에 쓰였는지 넓게 나누고, 그다음 더 정밀한 trace를 사용한다.

  1. perf stat으로 cycles, instructions, branches, branch-misses, cache-misses와 task-clock을 함께 수집한다.
  2. IPC가 낮고 cache miss가 높으면 SPE sample의 virtual/physical address, latency와 cache·TLB 결과로 어느 data access가 느린지 찾는다.
  3. branch miss가 높으면 BRBE의 최근 branch source·target과 type을 보되 다른 task의 기록이 섞이지 않게 context filter를 확인한다.
  4. 실행 경로 자체가 필요하면 ETE trace를 CoreSight funnel을 거쳐 TRBE/ETR buffer에 기록하고 instruction stream을 복원한다.
  5. raw event 번호는 CPU별 TRM과 PMU revision을 확인한다. 다른 Cortex의 같은 번호가 같은 event라고 가정하지 않는다.

VM에서: guest profiling은 address와 timing이라는 민감 정보를 만든다. host는 SPE/TRBE buffer를 vCPU별로 전환하고, guest가 허용받지 않은 host·다른 VM 주소를 관찰하지 못하게 filter와 ownership을 관리해야 한다.

RAS, RASv2와 SError

RAS architecture는 corrected·recoverable·fatal error를 error record와 syndrome으로 보고하고, software가 containment와 recovery를 결정하도록 한다. RASv2는 error record와 node·interrupt·delegation 구조를 확장한다.

SError

비동기 system error는 원인 instruction과 전달 시점이 다를 수 있다. precise exception처럼 해석하지 않는다.

Error record

status, address, miscellaneous syndrome과 corrected counter를 읽고 valid·overflow bit를 순서대로 처리한다.

Delegation

EL3·EL2·EL1 중 누가 error를 받고 guest에 무엇을 inject할지 firmware와 hypervisor policy가 정한다.

Recovery

page offlining, CPU isolation, VM termination과 system reset 중 error scope에 맞는 조치를 선택한다.

가상머신 한 번의 실행을 Linux 소스로 연결한다

vCPU 진입, Stage-2 fault, virtual interrupt 주입, 장치 DMA 변환을 각각 독립 문서로 분해했다. 세 경로를 함께 보면 CPU·interrupt·device isolation이 어디서 만나는지 보인다.

공식 자료