Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

8179
1390
307630


[Arm프로세서] Armv8 익셉션 레벨: 하이퍼바이저 콜 Armv8: 익셉션 레벨(EL)

운영체제의 커널이 구동되는 EL1에서 hvc 명령어를 실행하면 하이퍼바이저 콜이 발생해, EL1에서 EL2로 익셉션 레벨이 변경됩니다. 하이퍼바이저와 같은 가상화 환경에서 게스트 OS가 하이퍼바이저에게 어떤 서비스를 요청할 때 hvc 명령어를 실행합니다.

 

그림 4.8 가상화 환경에서 hvc 명령어를 실행할 때의 흐름

그림의 가운데 부분에서 ②로 표시된 부분을 봅시다. EL1에서 hvc 명령어를 실행해 EL2로 진입하는 동작을 나타냅니다. 이 동작은 Guest OS1과 Guest OS2에서 동시다발적으로 실행됩니다.

[정보]

EL1에서 hvc 명령어를 실행하면 EL2로 스위칭되면서 “EL2에서 실행되는 하이퍼바이저 내에 위치한” EL1 Synchronous 익셉션 벡터 주소로 프로그램 카운터가 브랜치(VBAR_EL2 + 0x400)됩니다. 그렇다면 이 동작을 어느 소스에서 확인할 수 있을까요? 오픈 소스 프로젝트로 운영되고 있는 XEN 하이퍼바이저의 코드를 참고하면 됩니다.

XEN 하이퍼바이저가 실행되는 시스템에서 EL1에서 hvc 명령어를 실행하면 EL2로 스위칭되면서 다음과 같은 동작을 수행합니다.

   * VBAR_EL2(EL2에 존재하는 익셉션 벡터 베이스 주소) + 0x400 주소로 브랜치
   * guest_sync 레이블로 브랜치
   * do_trap_guest_sync() 함수가 호출

다음은 EL2에서 실행되는 XEN 하이퍼바이저의 do_trap_guest_sync() 함수 구현부입니다.

https://github.com/xen-project/xen/blob/staging-4.13/xen/arch/arm/traps.c
01 void do_trap_guest_sync(struct cpu_user_regs *regs)
02 {
03    const union hsr hsr = { .bits = regs->hsr };
04
05    switch ( hsr.ec )
06    {
07    case HSR_EC_WFI_WFE:
...
08    case HSR_EC_HVC64:
09        GUEST_BUG_ON(psr_mode_is_32bit(regs));
10        perfc_incr(trap_hvc64);

코드의 내용으로 보아 EL1(64비트 운영체제 커널)에서 hvc 명령어를 실행하면 08번째 구문으로 실행됩니다.

#Reference Armv8: 익셉션 레벨(ELx)


Written by <디버깅을 통해 배우는 리눅스 커널의 구조와 원리> 저자
* 2021년 대한민국 학술원 선정 우수도서



---



핑백

덧글

댓글 입력 영역