[Arm프로세서] Armv8 익셉션 레벨: 하이퍼바이저 콜
By Guillermo Austin Kim | 2021년 12월 2일 |
운영체제의 커널이 구동되는 EL1에서 hvc 명령어를 실행하면 하이퍼바이저 콜이 발생해, EL1에서 EL2로 익셉션 레벨이 변경됩니다. 하이퍼바이저와 같은 가상화 환경에서 게스트 OS가 하이퍼바이저에게 어떤 서비스를 요청할 때 hvc 명령어를 실행합니다. 그림 4.8 가상화 환경에서 hvc 명령어를 실행할 때의 흐름 그림의 가운데 부분에서 ②로 표시된 부분을 봅시다. EL1에서 hvc 명령어를 실행해 EL2로 진입하는 동작을 나타냅니다. 이 동작은 Guest OS1과 Guest OS2에서 동시다발적으로 실행됩니다. [정보] EL1에서 hvc 명령어를 실행하면 EL2로 스위칭되면서 “EL2에서 실행되는 하이퍼바이저 내에 위치한” EL1 Synchronous 익셉션 벡터 주소로 프로그램
[ARMv8] cbnz 명령어
By Guillermo Austin Kim | 2020년 10월 5일 |
cbnz 명령어는 Compare Branch None-zero의 약자입니다.명령어의 이름 그대로 레지스터의 값이 0이 아닌 경우, 지정된 주소로 브랜치하는 명령어입니다. 아래 코드를 봅시다. 01 and x2,x1,#0x3F ; x2,x1,#6302 cbnz x2,0xFFFFFF8008083728 ; x2,work_pending 01번째 줄 코드를 봅시다.x1이 0x1이면 x2는 0x1, x1이 0x3f이면 x2는 0x3f가 됩니다. 이 경우 x2는 0x1 혹은 0x3f이므로 0이 아니니, non-zero가 됩니다. 그 다음 02번째 줄을 실행하면 work_pending 레이블의 시작 주소인 0xFFFFFF8008083728로 브랜치합니다. 01~02 번째 줄은 C 코드로
[Arm프로세서] Armv8: XEN 하이퍼바이저에서 익셉션 레벨을 체크
By Guillermo Austin Kim | 2021년 12월 14일 |
EL1에서 실행되는 리눅스 커널과 마찬가지로, EL2에서 구동되는 XEN 하이퍼바이저도 익셉션 레벨을 읽어서 제어하는 코드를 볼 수 있습니다. 이번에는 EL2에서 구동되는 XEN 하이퍼바이저에서 익셉션 레벨을 체크하는 루틴을 소개합니다. 이번에는 EL2에서 실행되는 XEN 하이퍼바이저의 check_cpu_mode 레이블의 구현부를 분석하겠습니다. check_cpu_mode:02 PRINT("- Current EL ")03 mrs x5, CurrentEL04 print_reg x505 PRINT(" -\r\n")0607 /* Are we in EL2 */08 cmp x5, #PSR_MODE_EL2t09 ccmp
[Arm프로세서] AAPCS: Armv8: 함수를 호출하기 위한 디자인
By Guillermo Austin Kim | 2021년 7월 26일 |
이번 절에서는 AAPCS64 기준으로, 실제 함수를 호출하는 예시 코드와 함께, 함수를 호출하면 SP와 X30 레지스터가 어떻게 바뀌는지 알아보겠습니다. 함수가 호출될 때의 세부 동작 원리 파악하기 여러분이 다음과 같은 함수를 작성했다고 가정하겠습니다. 01 int add_func(int x, int y)02 {03 int result = x + y;04 printf("x:%d, y:%d \n", x, y);05 06 return result;07 } [정보]위에서 든 예시 코드는 6.2 절에서 봤던 코드와 같은데, Armv8 아키텍처 기반의 Arm 코어에서 이 코드를 실행하면 같은 기능을 수행합니다. Armv7 아키텍처 다룬 함수 디자인 규칙은 Armv8 아키텍처에 거의 그대