TIL/2025

Trapping and Emulation of instructions

고무 오리 2025. 4. 29. 18:32
728x90
📢 Hypervisor의 trap & emulate 과정에 대해 알아봐요

 

 

 

Trapping and emulation of instructions

Hypervisor는 VM의 특정 동작(예: 전력 관리)을 Trap해서 Emulation할 수 있어요

Trap이 설정되면 VM이 특정 동작(레지스터 접근, WFI 실행 등)을 할 때 예외가 발생하고, Hypervisor가 제어권을 가져옵니다.

 

예를 들어,

  • HCR_EL2.TWI 비트 필드를 1로 설정하면
  • VM(EL1/EL0)이 WFI 명령을 실행할 때 CPU 저전력 전환 대신 Hypervisor로 Trap(Exception)이 발생해요

Hypervisor는 이를 이용해

  • CPU를 저전력으로 보내는 대신,
  • 다른 vCPU를 스케줄링할 수 있어요

이런 Trap 메커니즘은 VM 간 격리와 시스템 안정성을 지키는 데 필수적입니다.

          +----------+               +----------+
          |  vCPU0   |               |  vCPU1   |
          |   WFI    |               |          |
          +----------+               +----------+
               |                          ^  
               | (1)                      |  (2)
               | Trap due to              |  ERET
               | HCR_EL2.TWI              |
        +------|--------------------------|-------+
        |      v        Hypervisor        |       |
        |     +-----------------------------+     |
        |     |       Context Switcher      |     |
        |     +-----------------------------+     |
        +-----------------------------------------+

 

 

Trap 사용처를 알아봐요

레지스터 가상 값 제공하기 (Presenting virtual values of registers)

OS는 부팅 시 시스템 레지스터(ID_AA64MMFR0_EL1)를 읽어 프로세서의 지원 기능을 확인해요

Hypervisor는 Guest OS가 진짜 값을 알지 못하도록 가상(virtual) 값을 제공하죠

그래서 레지스터 읽기에 Trap을 걸고, Trap이 발생하면 가짜 값으로 응답해요

(1) Read a register (ID_AA64MMFR0_EL1) in the EL0/1

(2) Trap exception (VM Exit)

(3) Check Exception type, register name (ESR_EL2 : EL2에서 발생한 예외 진단 정보를 담고 있는 시스템 레지스터)

(4) Run a proper handler

(5) ERET (VM Entry)

 

하드웨어는 그대로 두고, Guest에게 다른 세상을 보여줄 수 있어요

 

Lazy Context Switching에 트랩 활용하기

  • 보통 OS는 부팅 후 한 번 설정한 MMU 설정 레지스터(TTBR<n>_EL1, TCR_EL1, MAIR_EL1)를 거의 수정하지 않아요
  • Hypervisor는 복원만 하고 저장(save)을 생략해 Context Switch 속도를 최적화 할 수 있죠
  • 만약 Guest가 레지스터를 수정하려 하면, HCR_EL2.TVM Trap을 걸어 이를 감지하고 저장을 수행해요

빠른 처리를 하면서도 예외 상황은 놓치지 않는 최적화에요

 

Trap vs Routing 개념 구분

  • Trap: 특정 행동(예: 레지스터 읽기/쓰기)을 하면 예외(Exception) 를 발생 시키는 것
  • Routing: 발생한 예외를 어느 Exception Level(EL0~EL3) 로 보낼지 결정하는 것

Trap은 "예외를 만들고", Routing은 "예외를 어디로 보낼지"를 결정해요

 

 

그러나 Trap은 무거운 작업

MIDR, MPIDR라는 두 레지스터가 있어요

OS가 CPU 정보를 확인하는 매우 빈번히 불리는 레지스터죠

자주 읽히기 때문에, 읽을 때마다 Trap 걸리면 성능이 느려져요

 

해결책: Trap 없이 가상 값을 주는 방법 사용!

  • Hypervisor가 부팅 시 VPIDR_EL2 (가짜 MIDR) VMPIDR_EL2 (가짜 MPIDR)를 미리 설정해요
  • 그러면 Guest가 MIDR_EL1 / MPIDR_EL1을 읽을 때 Trap 없이 가짜 값이 자동 반환 되죠

단, VPIDR_EL2, VMPIDR_EL2는 꼭 초기화가 필요해요 (Reset 후 값 없음)

 

 

Reference

https://developer.arm.com/documentation/102142/0100/Trapping-and-emulation-of-instructions

 

Documentation – Arm Developer

 

developer.arm.com

 

 

 

 

 

 

 

 

728x90