이전 절에서 익셉션 벡터 테이블의 스팩을 분석했습니다. 이어서 EL2가 실행되는 하이퍼바이저 관점에서 익셉션 벡터 테이블을 분석하겠습니다.
다음은 하이퍼바이저가 실행되는 EL2에서 본 익셉션 벡터 테이블의 동작 방식을 나타낸 표입니다.
표 12.2 하이퍼바이저 관점에서 본 익셉션 벡터 테이블
'EL2 with SP_EL0' 열의 내용을 분석하겠습니다. 'EL2 with SP_EL0'은 익셉션 레벨에 상관없이 스택을 설정하는 조건에서 실행되는 익셉션의 종류 별 오프셋을 나타냅니다. 그런데 일반적으로 대부분의 하이퍼바이저에서 지원하지 않습니다.
[정보]
XEN 하이퍼바이저에서는 'EL2 with SP_EL0' 익셉션을 지원하지 않습니다.
이어서 'EL2에서 발생'로 표기된 부분을 보겠습니다. 0x200, 0x280, 0x300 그리고 0x380으로 명시된 내용은 하이퍼바이저가 구동되는 EL2에서 익셉션이 유발되면, 익셉션의 종류별로 브랜치되는 오프셋 주소를 나타냅니다.
만약 EL2에서 실행되는 하이퍼바이저에서 Synchronous 익셉션이 유발되면, 다음고 같이 익셉션 벡터 베이스 주소(VBAR_EL2) 기준으로 +0x200 오프셋을 적용한 주소로 프로그램 카운터가 브랜치됩니다.
* Synchronous 익셉션 벡터 주소: VBAR_EL2 + 0x200
만약 EL2에서 'IRQ 인터럽트' 익셉션이 유발되면, 다음과 같이 익셉션 벡터 베이스 주소인 VBAR_EL2 기준으로 +0x280 오프셋을 적용한 주소로 프로그램 카운터가 브랜치됩니다.
* IRQ 인터럽트 익셉션 벡터 주소: VBAR_EL2 + 0x280
FIQ와 SError 익셉션이 유발되면 같은 방식으로 'VBAR+EL2 + 0x300'과 'VBAR+EL2 + 0x380' 주소로 프로그램 카운터가 브랜치됩니다.
[정보]
대부분 하이퍼바이저에서는 FIQ 익셉션을 지원하지 않습니다. FIQ는 세큐어 월드에서 실행되는 Trusted OS에 받아 처리하게 시스템을 구성합니다.
이어서 'EL1에서 발생(Aarch64)'로 표기된 부분을 보겠습니다. 게스트 OS가 구동되는 EL1에서 익셉션이 유발되면 브랜치되는 주소를 나타냅니다.
EL1에서 실행되는 게스트 OS에서 hvc, wfe, wfi 명령어를 실행하면 Synchronous 익셉션이 유발됩니다. 이 때 다음과 같이 익셉션 벡터 베이스 주소(VBAR_EL2) 기준으로 +0x400 오프셋을 적용한 주소로 프로그램 카운터가 브랜치됩니다.
* Synchronous 익셉션 벡터 주소: VBAR_EL2 + 0x400
이와 같은 동작을 “게스트 Exit 혹은 하이퍼바이저로 트랩된다”라고 설명할 수 있습니다.
[중요]
EL1에서 hvc, wfe, wfi 명령어를 실행하려면 HCR_EL2 레지스터를 구성하는 HDC, TWE, TWI 비트를 1로 설정해야 합니다. 관련 내용은 12.3 절에서 확인할 수 있습니다.
또한 게스트 OS가 실행되는 EL1에서 'IRQ 인터럽트' 익셉션이 유발되면, 익셉션 벡터 베이스 주소인 VBAR_EL2 기준으로 +0x480 오프셋을 적용한 주소로 프로그램 카운터가 브랜치됩니다.
* IRQ 인터럽트 익셉션 벡터 주소: VBAR_EL2 + 0x480
일반적으로 EL1에서 설정한 IRQ 인터럽트는 EL1에서 처리되나, HCR_EL2.IMO 레지스터를 설정하면 해당 인터럽트를 EL2에서 받아 처리할 수 있습니다.
다음으로 게스트 OS가 실행되는 EL1에서 'FIQ 인터럽트' 익셉션이 유발되면 브랜치되는 주소를 알아 봅시다. 익셉션 벡터 베이스 주소인 VBAR_EL2 기준으로 +0x500 오프셋을 적용한 주소로 다음과 같이 프로그램 카운터가 브랜치됩니다.
* FIQ 인터럽트 익셉션 벡터 주소: VBAR_EL2 + 0x500
대부분 하이퍼바이저는 FIQ를 지원하지 않으며, +0x500 오프셋을 적용한 주소에는 크래시를 유발하는 *_invalid 와 같은 레이블이 실행됩니다.
마지막으로 게스트 OS가 실행되는 EL1에서 'SError 인터럽트' 익셉션이 유발되면, 익셉션 벡터 베이스 주소인 VBAR_EL2 기준으로 +0x580 오프셋을 적용한 주소로 프로그램 카운터가 브랜치됩니다. 규칙은 다음과 같습니다.
* FIQ 인터럽트 익셉션 벡터 주소: VBAR_EL2 + 0x500
일반적으로 EL1에서 설정한 'SError 인터럽트'는 EL1에서 처리되나, HCR_EL2.xxx 레지스터를 설정하면 해당 'SError 인터럽트' 익셉션을 EL2에서 받아 처리할 수 있습니다.
'EL1에서 발생(Aarch32)' 열은 EL1에서 실행되는 게스트 OS가 32비트 환경에서 실행될 때 처리되는 익셉션입니다. 최근 대부분 게스트 OS(e.g: 리눅스 커널)는 64비트 모드로 실행되므로 'EL1에서 발생(Aarch32)' 열에서 정의된 익셉션은 "하위 호환성을 위해 정의됐다"라는 정도로 알아 둡시다.



최근 덧글