[Arm프로세서] 하이퍼바이저를 구성하는 요소
By Guillermo Austin Kim | 2022년 1월 12일 |
2개 이상의 멀티 운영체제를 동시다발적으로 실행할 수 있는 플렛폼이나 아키텍처를 하이퍼바이저라고 소개했습니다. 이어서 다음 그림을 보면서 하이퍼바이저 아키텍처를 구성하는 주요 기능에 대해 알아봅시다. 그림 12.1 하이퍼바이저 아키텍처의 전체 구조 위 그림의 가운데 윗 부분을 보면 게스트 OS1, 게스트 OS2라고 표시된 부분은 하이퍼바이저에서 실행되는 운영체제입니다. 게스트 OS1이 안드로이드, 게스트 OS2는 리눅스가 될 수 있습니다. 그런데 게스트 OS1와 게스트 OS2에서 실행되는 운영체제는 각각 독립적인 EL0와 EL1에서 실행됩니다. 게스트 OS1의 커널은 EL1, 게스트 OS1의 애플리케이션은 EL0에서 실행됩니다. 마찬가지로 게스트 OS2의 커널은 EL1, 게스트 OS2의 애플리케이
[ARM프로세서] 익셉션(Exception)이 발생할 때 기본 동작
By Guillermo Austin Kim | 2020년 10월 15일 |
익셉션은 ARM 프로세서의 핵심 기능 중 하나입니다. 이번 절에서는 ARM 아키텍처에서 적용된 익셉션의 개념을 소개하고, ARM 프로세서에서 익셉션이 어떤 방식으로 동작하는지 설명합니다. 이후 소프트웨어 관점으로 익셉션이 무엇인지 살펴보겠습니다. 익셉션은 ARM 프로세서의 핵심 기능 중 하나입니다. 이번 절에서는 CPU 아키텍처에서 적용된 익셉션의 개념을 소개하고, ARM 프로세서에서 익셉션이 어떤 방식으로 동작하는지 설명합니다. 익셉션(Exception)이란 무엇일까요? 익셉션을 한 문장으로 정의 내리기는 어렵지만 다른 용어와 함께 설명하기는 어렵진 않습니다. 그럼 같이 다음 문장을 읽어볼까요? ❑ 익셉션이 발생하면 ARM의 동작 모드가 변경됩니다. ❑ 익셉션이 발생
[라즈베리파이] 인터럽트 백터 어셈블리 코드 및 동작 분석
By Guillermo Austin Kim | 2018년 2월 13일 |
인터럽트가 발생하면 __irq_svc 벡터로 점프합니다. 물론 해당 프로세스는 하던 일을 멈출 수 밖에 없는데요.그럼 인터럽트 벡터에서 어떤 동작을 하는 지 어셈블리 코드를 분석하겠습니다. #__irq_svc 코드 리뷰[1]: 스택 공간을 0x4C 바이트만큼 확보합니다. [2]--[3]: 현재 실행 중인 레지스터 R0부터 R14, PC까지 스택에 푸쉬합니다. [4]: 0x80705398 메모리 공간에 있는 메모리 덤프 0x80c089ac를 로딩합니다. 0x80c089ac는 handle_arch_irq란 함수 포인터 역할을 하는 변수인데 이 변수에는 gic_handle_irq가 지정되어 있습니다.crash> p -x handle_arch_irqhandle_arch_irq = $3 = 0xc01
[Arm프로세서] Armv8: 리눅스 커널에서 익셉션 레벨을 읽어서 제어하는 루틴
By Guillermo Austin Kim | 2021년 12월 6일 |
먼저 리눅스 커널이 부팅하는 과정에서 익셉션 레벨을 읽어서 제어하는 루틴을 소개합니다. Armv8 기반 리눅스 커널이 부팅을 할 때 el2_setup 레이블이 호출되는데, 이 레이블에서는 현재 익셉션 레벨을 읽어서 관련된 처리를 수행합니다. 다음은 el2_setup 레이블의 구현부입니다. SYM_FUNC_START(el2_setup)02 msr SPsel, #1 // We want to use SP_EL{1,2}03 mrs x0, CurrentEL04 cmp x0, #CurrentEL_EL205 b.eq 1f06 mov_q x0, (SCTLR_EL1_RES1 | ENDIAN_SET_EL1)07 msr sctlr_el1, x008 mov w0, #BOOT_CPU_MODE_EL1 // This cpu