HVC는 하이퍼바이저 콜(Hypervisor Call)이라고 하며, EL1에서 HVC 명령어를 실행하면 EL2로 진입합니다.
Arm 스펙 문서에서 HVC 명령어 알아보기
먼저 Arm 스펙 문서에서 HVC 명령어를 설명한 부분을 소개합니다.
출처: Arm Architecture Reference Manual Armv8, for A-profile architecture https://developer.arm.com/documentation/ddi0487/gb
C6.2.94 HVC
Hypervisor Call causes an exception to EL2. Software executing at EL1 can use this instruction to call the hypervisor to request a service.
스펙 문서의 내용은 다음과 같이 해석할 수 있습니다.
하이퍼바이저 콜은 EL2로 익셉션을 유발한다.
EL1에서 실행되는 소프트웨어는 HVC 명령어를 사용해 하이퍼바이저에게 어떤 서비스를 요청한다.
EL1에서 HVC 명령어를 실행해 하이퍼바이저가 구동되는 EL2로 진입하는 동작을 하이퍼바이저 콜이라고 합니다. 여기서 HVC 명령어를 실행해 하이퍼바이저 콜을 유발하는 소프트웨어는 EL1에서 실행되는 리눅스 커널이나 RTOS 커널입니다.
EL2에서 실행되는 하이퍼바이저 위에서 구동되는 여러 게스트 OS(EL1)가 있는데, 하이퍼바이저에게 어떤 서비스를 요청하기 위해 HVC 명령어를 실행합니다. 이런 동작을 게스트 Exit라고 합니다.
---
[정보] EL1에서 EL2로 진입하는 이유는 무엇일까?
EL1에서 실행되는 다수의 게스트 OS의 리소스를 제어하고 관리하는 권한이 EL2에 있는데, EL2에서 실행되는 하이퍼바이저에게 어떤 서비스를 요청하기 위해 EL1에서 EL2로 진입합니다. 이를 위해서는 EL1에서 HVC, WFE, WFI 명령어를 실행해야 하는데, 이 과정에서 트랩이 유발됩니다. 여기서 트랩은 익셉션 관점에서 소프트웨어로 유발되는 Synchronous 익셉션으로 볼 수 있습니다.
---
HVC 명령어의 형식
이어서 HVC 명령어의 형식을 알아봅시다.
그림 15.5 HVC 명령어의 형식
대부분 어셈블리 명령어가 실행될 때 범용 레지스터를 사용해 명령어의 입력 값이 전달되거나 실행 결과가 업데이트됩니다. 그런데 HVC 명령어의 형식을 보면 범용 레지스터는 보이지 않습니다. HVC 명령어 다음에 #imm과 같이 상수형 인자를 지정할 수 있는데 #imm의 범위는 0 ~ 65535입니다.
HVC 명령어를 실행하기 전에 X0 ~ X7 레지스터에 아규먼트를 저장해 전달하는 방식을 HVC calling convention이라고 합니다.
HVC 명령어가 실행되기 위한 조건
그런데 HVC 명령어를 실행하면 항상 EL2로 진입할까요? 항상 그렇지는 않습니다. HVC 명령어가 실행되려면 HCR_EL2를 구성하는 비트 필드가 설정돼야 하는데, 이를 Arm 스펙 문서에서 확인할 수 있습니다.
The HVC instruction is UNDEFINED:
When EL3 is implemented and SCR_EL3.HCE is set to 0.
When EL3 is not implemented and HCR_EL2.HCD is set to 1.
When EL2 is not implemented.
At EL1 if EL2 is not enabled in the current Security state.
At EL0.
출처: Arm Architecture Reference Manual Armv8, for A-profile architecture https://developer.arm.com/documentation/ddi0487/gb
위 내용은 다음과 같이 요약할 수 있습니다.
HVC 명령어는 다음과 같은 조건에서 Undefined(정의되지 않는) 명령어로 간주된다.
EL3가 구현됐는데 SCR_EL3 레지스터의 HCE 비트가 0으로 설정된 경우
EL3가 구현돼 있지 않고 HCR_EL2 레지스터의 HCD 비트가 1로 설정된 경우
EL2(하이퍼바이저)가 구현되지 않은 경우
현재 Security 상태에서 EL2가 활성화되지 않은 경우에 실행되는 EL1
EL0 익셉션 레벨
따라서 HVC 명령어를 실행했는데 EL2로 진입하지 못하면 위에 명시된 조건을 확인합시다.
< '시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리' 저자>
'시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리 > 15장: 가상화(Virtualization)' 카테고리의 다른 글
[가상화-virtualization] HCR_EL2 레지스터 (1) | 2023.10.06 |
---|---|
[가상화-virtualization] WFE, WFI 명령어 (0) | 2023.10.06 |
[가상화-virtualization] 하이퍼바이저는 왜 알아야 할까? (0) | 2023.10.05 |
[가상화-virtualization] 하이퍼바이저를 구성하는 요소 (0) | 2023.10.05 |
[가상화-virtualization] 하이퍼바이저 타입 (1) | 2023.10.05 |