본문 바로가기

시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리/15장: 가상화(Virtualization)

[가상화-virtualization] HCR_EL2 레지스터

HCR_EL2는 ‘Hypervisor Configuration Register, EL2’의 약자로서 하이퍼바이저의 세부 동작을 설정하는 가장 중요한 레지스터 중 하나입니다. HCR_EL2는 EL1에서 EL2로 진입(트랩)하는 방식을 설정하는 비트 필드로 구성돼 있습니다. HCR_EL2 레지스터의 접미사에 있는 EL2는 이 레지스터에 접근할 수 있는 최소 익셉션 레벨이므로 EL2 혹은 EL3에서만 접근할 수 있습니다.  

다음 그림은 HCR_EL2 레지스터의 비트 필드 정보입니다.

 

 

 

 

 

 

 

 

 

 

 

그림 15.6 HCR_EL2 레지스터의 비트 필드 

다른 레지스터와 같이 레지스터를 구성하는 비트를 1로 설정하면 해당 비트 필드와 관련된 동작이 수행됩니다. HCR_EL2 레지스터를 구성하는 비트 필드 중에 중요한 내용을 소개하겠습니다.
 
FMO, bit [3]

물리적인 FIQ 라우팅 방식을 설정하는 비트 필드입니다. 각 비트에 따라 다음과 같이 설정됩니다.

 0b0: 가상 FIQ 인터럽트를 비활성화하므로 물리적인 FIQ가 EL2로 라우팅되지 않음
 0b1: 물리적인 FIQ가 유발되면 EL2로 라우팅됨

일반적으로 FIQ는 시큐어 인터럽트로 처리되므로 EL3 모니터 혹은 시큐어 EL1에서 받아 처리합니다.
 
IMO, bit [4]

IMO는 물리적인 IRQ 라우팅 방식을 설정하는 비트 필드입니다. 각 비트에 따라 다음과 같이 설정됩니다.

 0b0: 가상 IRQ 인터럽트를 비활성화하므로 물리적인 IRQ가 EL2로 라우팅되지 않음
 0b1: 물리적인 IRQ가 유발되면 EL2로 라우팅됨. EL2나 EL1에서 인터럽트가 유발되면 EL2에 존재하는 익셉션 핸들러(VBAR_EL2)가 받아 처리

만약 SCR_EL3.IRQ 비트가 1로 설정되면 EL3에 존재하는 익셉션 핸들러(VAR_EL3)가 받아 인터럽트를 처리합니다. 만약 IMO 비트가 0으로 설정되면 EL2보다 낮은 익셉션 레벨에서 설정된 인터럽트를 EL2가 받아 처리하지 않습니다.

AMO, bit [5]

이 비트는 EL1에서 발생한 Asynchronous 익셉션을 EL2에 위치한 익셉션 핸들러가 받아 처리하기 위한 용도로 사용됩니다. AMO 비트가 1로 설정됐으면 EL2나 EL2보다 낮은 익셉션 레벨에서 Asynchronous 혹은 SError 인터럽트가 발생하면 EL2로 트랩됩니다. 

TWI, bit [13]

WFI 명령어에 대한 트랩을 설정하는 비트 필드로, 각 비트에 따라 다음과 같이 설정됩니다.

 0b0: WFI 명령어를 실행하면 EL2로 트랩되지 않고 Arm 코어가 저전력 모드로 진입
 0b1: EL0 혹은 EL1에서 WFI 명령어를 실행하면 트랩이 발생하면서 EL2로 익셉션 레벨이 변경 

TWE, bit [14]

TWI 비트와 비슷한 용도로 WFE 명령어에 대한 트랩을 설정하는 비트 필드입니다. 각 비트에 따라 다음과 같이 설정됩니다.

 0b0: WFE 명령어를 실행하면 EL2로 트랩되지 않고 Arm 코어가 저전력 모드로 진입
 0b1: EL0 혹은 EL1에서 WFE 명령어를 실행하면 트랩이 발생하면서 EL2로 익셉션 레벨이 변경 

TSC, bit [19]

SMC 명령어와 관련된 트랩 방식을 설정하는 비트 필드입니다.

 0b0: EL1에서 SMC 명령어를 실행하면 EL3에 존재하는 모니터 모드로 진입
 0b1: EL1에서 SMC 명령어를 실행하면 EL2로 트랩

여러 게스트 OS에서 SMC 명령어를 실행하면 동시다발적으로 EL3에 진입할 수 있어 누군가 이를 받아 처리해야 합니다. 이때 TSC 비트 필드를 1로 설정하면 여러 게스트 OS에서 SMC 명령어를 통해 EL2에서 실행되는 하이퍼바이저에 존재하는 익셉션 핸들러로 트랩됩니다. 이를 SMC 명령어 후킹이라고 합니다.

TVM, bit [26]

가상 메모리를 제어하기 위한 트랩을 설정하는 비트입니다. TVM 비트가 1로 설정될 경우 EL1에서 다음과 같은 메모리를 제어하는 레지스터에 어떤 값을 쓰면 EL2로 트랩됩니다. 

 SCTLR_EL1
 TTBR0_EL1
 TTBR1_EL1
 TCR_EL1
 ESR_EL1
 FAR_EL1
 AFSR0_EL1
 AFSR1_EL1
 MAIR_EL1
 AMAIR_EL1
 CONTEXTIDR_EL1

EL2로 트랩될 때 Arm 코어는 하드웨어적으로 ESR_EL2(익셉션 신드롬 레지스터)의 [31:26] 비트에 0x18 값을 씁니다.

TGE, bit [27]

TGE 비트 필드는 EL1에서 발생한 익셉션을 EL2로 라우팅할 때 설정합니다. 비트에 따라 다음과 같이 설정됩니다.

 0b0: EL1에서 발생한 익셉션이 EL2로 라우팅되지 않음. EL1에서 익셉션이 발생하면 EL1에 존재하는 익셉션 벡터 주소(VBAR_EL1 기준)로 프로그램 카운터가 분기
 0b1: EL1에서 발생한 익셉션이 EL2로 라우팅됨  

운영체제의 커널에서 실행되는 시스템 정보를 EL2에서 실행되는 하이퍼바이저가 후킹할 때도 사용됩니다. 

HCD, bit [29]

HCD 비트는 HVC 명령어인 하이퍼바이저 콜에 대한 마스킹(비활성화)을 설정하는 기능입니다. HCD 비트가 0으로 설정되면 HVC 명령어가 활성화됩니다. HCD 비트가 1으로 설정되면 HVC 명령어는 비활성화됩니다. 이 조건에서 HVC 명령어를 실행하면 정의되지 않은 명령어(Undefined Instruction)로 간주되어 익셉션이 유발됩니다.

이번 절에서는 HCR_EL2 시스템 레지스터를 이루는 비트 필드에 대해 알아봤습니다. HCR_EL2 시스템 레지스터를 통해 하이퍼바이저의 세부 동작을 설정할 수 있어 하이퍼바이저를 초기화할 때 HCR_EL2는 반드시 체크해야 합니다. 

 

< '시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리' 저자>