TIL/2025

Virtualizing Exceptions in the Arm Architecture AArch64

고무 오리 2025. 4. 29. 21:42
728x90
📢 Virtualizing Exception에 대해 알아봐요

 

 

왜 Virtual Exception이 필요한가

실제 하드웨어 인터럽트(IRQ, FIQ, SError)는

  1. 일부는 하이퍼바이저(EL2)가 처리해야 하고,
  2. 일부는 VM(EL0/EL1) 안의 소프트웨어(vCPU)가 처리해야 해요

VM이 그 순간 실행 중이지 않을 수도 있어, 하이퍼바이저(EL2)가 대신 받아두고 적절한 시점에 전달해 줘야 하죠

 

 

가상 인터럽트(vIRQ/vFIQ/vSError) 개념

하이퍼바이저가 실제 인터럽트를 여러 Guest OS에게 전달하기 위해 만들어낸 "가짜 인터럽트"에요

물리 인터럽트처럼 동작하지만 EL0/EL1에서만 발생하며, EL2/EL3에선 절대 발생하지 않아요

 

 

Virtual Interrupt 활성화 (Enabling)

하이퍼바이저가 부팅 혹은 VM 런칭(vcpu context switching) 시 HCR_EL2 레지스터 내 아래 비트를 set 해줘요

  • IMO → vIRQ 허용
  • FMO → vFIQ 허용
  • AMO → vSError 허용

이 설정으로 물리 IRQ는 EL2로 라우팅 되며, EL1에 vIRQ를 주입 할 수 있죠

 

 

가상 인터럽트 생성(Generation) : 두 가지 방식

방법1. 레지스터 세팅 방식 (Software 방식)

EL2에서 HCR-EL2.VI/VF/VSE 비트 세팅 → 즉시 vIRQ 발생

  • VI = Setting this bit registers a vIRQ
  • VF = Setting this bit registers a vFIQ
  • VSE = Setting this bit registers a vSError

Guest가 인터럽트 받을 때마다 ICV 레지스터 접근이 모두 "Trap → 에뮬레이션" 으로 이어져 오버헤드가 커요

 

방법2. GIC 가상 CPU 인터페이스 (Hardware 기반)

1. 물리 인터럽트 발생

  • GIC가 해당 pCPU로 인터럽트 전달
  • HCR_EL2.IMO/FMO 설정 덕분에 EL2(하이퍼바이저)로 trap

2. 하이퍼바이저(EL2) 처리

  • 인터럽트가 어느 VM/vCPU에 해당하는지 판단 (mapping table 참조)
  • 해당하는 vCPU의 ICH_LR에 virtual IRQ 정보를 등록만 하고 빠짐 (실제 처리는 안 함)

3. vCPU 실행 (VM Entry)

  • vCPU 실행 시점에, GIC의 Virtual CPU Interface(GICV)가 하드웨어적으로 virtual IRQ exception 발생
  • 이때는 EL2 trap 없이, EL1에서 직접 처리

4. EL1 IRQ 처리

  • 게스트 OS는 마치 실제 인터럽트를 받은 것처럼 PSTATE.I 등의 마스크 조건에 따라 vIRQ를 처리함
  • IRQ 핸들러 실행 등 모든 처리는 EL1에서 완료 → trap 오버헤드 없음

 

 표로 정리하면,

레지스터 세팅 방식 GIC 가상 CPU Interface
예전 사용하던 소프트웨어 구현 방식 하드웨어 가상화 지원 이용한 방식
Peripheral → Hypervisor → VI 세트 → Guest 진입 → Trap → EL2 → vIRQ 전달 Peripheral → Hypervisor → ICH_LR 세트 → Guest 진입 → Direct vIRQ
매번 EL2 entry 발생 한번 설정 후 하드웨어가 바로 Guest 전달

 

 

EL1에서의 PSTATE 마스킹 의미 변화

HCR_EL2.IMO==1 상태의 EL1에서는

  • PSTATE.I 가 vIRQ 마스크를 뜻해요
  • PSTATE.F 가 vFIQ 마스크를 뜻해요
  • PSTATE.A 가 vSError 마스크를 뜻해요

물리 인터럽트(pIRQ)가 아니라, 가상 인터럽트에 대해 동작한다는 점이 달라져요

 

 

Reference

https://developer.arm.com/documentation/102142/0100/Virtualizing-exceptions

 

Documentation – Arm Developer

 

developer.arm.com

 

728x90