시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리/15장: 가상화(Virtualization) (11) 썸네일형 리스트형 [가상화-virtualization] EL2:익셉션 핸들러 코드 소개 먼저 이번 절에서 분석할 XEN 하이퍼바이저에서 구현된 익셉션 핸들러의 전체 코드를 소개합니다. 01 0x26a800 : 02 0x26a800: b 0x269800 03 0x26a804: nop 04 0x26a808: nop ... 05 0x26a880: b 0x26986c 06 0x26a884: nop 07 0x26a888: nop ... 08 0x26a900: b 0x2698d8 09 0x26a904: nop 10 0x26a908: nop ... 11 0x26a980: b 0x269944 12 0x26a984: nop 13 0x26a988: nop ... 14 0x26aa00: .. [가상화-virtualization] 가상화 관점의 익셉션 벡터 테이블 분석 이전 절에서 익셉션 벡터 테이블의 스펙을 간단히 리뷰했습니다. 이어서 EL2 관점에서 익셉션 벡터 테이블을 자세히 분석하겠습니다. EL2 관점에서 분석한 익셉션 벡터 테이블 다음은 하이퍼바이저가 실행되는 EL2 기준에서 본 익셉션 벡터 테이블을 나타낸 표입니다. 먼저 'EL2 with SP_EL0' 행의 내용을 분석합시다. 'EL2 with SP_EL0'는 익셉션 레벨에 상관없이 스택을 설정하는 조건에서 실행되는 익셉션 종류별 오프셋을 나타냅니다. 그런데 대부분의 하이퍼바이저는 이와 같은 익셉션은 지원하지 않습니다. EL2에서 발생한 익셉션 분석 이어서 'EL2에서 발생'로 표시된 부분을 봅시다. 0x200, 0x280, 0x300, 0x380은 하이퍼바이저가 구동되는 EL2에서 .. [가상화-virtualization] HCR_EL2 레지스터에 접근하는 명령어 HCR_EL2 레지스터를 구성하는 비트 필드 정보를 파악하면 "이 비트를 어떻게 설정할 수 있을까?"라는 의문이 생깁니다. Armv8 아키텍처에서는 HCR_EL2 레지스터의 값을 읽고 쓸 수 있는 MRS, MSR 명령어를 제공합니다. HCR_EL2 레지스터는 읽는 MRS 명령어 먼저 HCR_EL2 레지스터의 값을 읽기 위해서는 다음과 같은 형식의 MRS 명령어를 실행하면 됩니다. 그림 15.7 HCR_EL2 레지스터를 읽는 MRS 명령어 그림 15.7은 HCR_EL2 레지스터의 값을 Xt 레지스터로 로딩하는 명령어입니다. 위 그림에서 보이는 는 Armv8 아키텍처에서 정의된 범용 레지스터를 뜻하며, X0 ~ X30 레지스터 중 하나가 지정됩니다. MRS 명령어를 사용하면 HCR_EL2 레지스터의 어떤 비.. [가상화-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 레지스터를 구성하는 비트 필드 중에 중요한 내용을 소개하겠습.. [가상화-virtualization] WFE, WFI 명령어 많은 개발자들은 “HVC 명령어를 통해서만 EL1에서 EL2로 진입할 수 있다”라고 알고 있습니다. 사실 그렇지는 않습니다. WFE와 WFI 명령어를 실행해도 EL1에서 실행되는 게스트 OS에서 EL2로 진입할 수 있습니다. --- [정보] WFI와 WFE 명령어 WFI와 WFE 명령어는 Arm 아키텍처에서 지원하는 저전력 기능 중 하나입니다. 리눅스 커널이나 RTOS 관점에서 루틴을 분석하면 "함수가 동시다발적으로 아주 빠르게 실행된다"라고 느끼지만 이를 실행하는 Arm 코어 입장에서는 여러 함수에서 특정 루프(예: while)를 반복하면서 데이터가 특정 조건을 만족할 때까지 기다리는 동작을 자주 수행합니다. 이 상황에서 Arm 코어가 저전력 모드(스탠바이)에 진입하면 전력을 최적화해 Arm 코어를 실.. [가상화-virtualization] HVC 명령어 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 .. [가상화-virtualization] 하이퍼바이저는 왜 알아야 할까? 하이퍼바이저가 무엇인지 알고 나면 "하이퍼바이저를 왜 알아야 할까?"라는 의문이 생길 것입니다. 사실 하이퍼바이저는 x86 기반 CPU에서 VMware나 IBM과 같은 기업에서 20 ~ 30년전 부터 꾸준히 개발해 왔습니다. x86 CPU 기반의 데스크톱이나 서버에서 개발됐던 기술인데, Armv8 아키텍처에서 하이퍼바이저를 왜 알아야 하는지 궁금할 것입니다. 클라우드 서버에서의 하이퍼바이저 활용 이미 유닉스 기반으로 서버를 개발했던 주요 기업(예: 썬마이크로시스템즈, HP, IBM)에서는 2000년 이전부터 하이퍼바이저 기반으로 구동되는 서버를 개발했습니다. 2022년 이후 소프트웨어 업계를 이끌 기술은 AI와 빅데이터와 클라우드인데, 이 세 가지 기술들이 다양한 제품군의 생태계에 영향을 끼치고 있습니다.. [가상화-virtualization] 하이퍼바이저를 구성하는 요소 앞에서 2개 이상의 운영체제를 동시다발적으로 실행할 수 있는 플랫폼이나 아키텍처를 하이퍼바이저라고 소개했습니다. 이어서 다음 그림을 보면서 하이퍼바이저 아키텍처를 구성하는 주요 기능에 대해 알아봅시다. 그림 15.3 하이퍼바이저 아키텍처의 전체 구조 위 그림의 가운데 윗부분에 표시된 게스트 OS 1, 게스트 OS 2는 하이퍼바이저에서 실행되는 운영체제입니다. 게스트 OS 1이 안드로이드, 게스트 OS 2는 리눅스가 될 수 있습니다. 그런데 게스트 OS 1와 게스트 OS 2에서 실행되는 운영체제는 각각 독립적인 EL0와 EL1에서 실행됩니다. 게스트 OS 1의 커널은 EL1, 게스트 OS 1의 애플리케이션은 EL0에서 실행됩니다. 마찬가지로 게스트 OS 2의 커널은 EL1, 게스트.. 이전 1 2 다음