Armv8 아키텍처 - 익셉션 레벨

TAEWOO HA·2023년 8월 1일
0

시스템 반도체

목록 보기
4/4
post-custom-banner

익셉션 레벨

EL0 : 유저 애플리케이션 / PL0 /unprivilege level(시스템 설정 제한)
EL1 : 운영체제의 커널 / PL1 / 인터럽트, MMU, 캐시 기능을 설정
EL2 : 하이퍼바이저 / PL2 / 게스트 OS끼리 스위칭하고 게스트 OS의 시스템 리소스에 접근
EL3 : 시큐어 모니터 모드 / PL3 / Highest privilege level

  • EL0 , EL1은 필수

  • EL3 모니터 : 시큐어와 논시큐어를 스위칭하는 익셉션 레벨

  • 트러스트존
    익셉션 레벨의 개념 위에 트러스트존이 구성됨
    트러스트존에 진입하기 위해서는 EL1에서 EL3로 진입(SMC)해야 함

EL0와 PL0

유저 애플리케이션이 실행
unprivileged 레벨 혹은 PL0로 실행
EL0에서는 인터럽트, MMU, 캐시 기능을 설정할 수 없음

EL1와 PL1

EL1은 PL1 권한이 있는 익셉션 레벨
리눅스 커널에서는 인터럽트, MMU, 캐시 설정과 같이 시스템을 설정 가능

EL2와 PL2

PL2는 EL2에게 부여되는 권한 레벨로 게스트 OS끼리 스위칭하고 게스트OS의 시스템 리소스에 접근 가능
일반적으로 EL2에서 하이퍼바이저가 실행되며, 하이퍼바이저는 PL2 권한레벨로 실행됨

EL3와 PL3

PL3는 EL3에게 부여되는 권한 레벨로 highest privileged level임
시스템을 모두 설정할 수 있고, 익셉션 레벨에 존재하는 모든 레지스터에
엑세스할 수 있어 Booting 과정에서 EL3로 설정

아키텍처

  • 게스트 OS에서는 리눅스 커널 or RTOS

익셉션 레벨과 부팅과정

  • 더 높은 익셉션 레벨에서 더 낮은 익셉션 레벨로 진입하는 경우 많은 어셈블리 인스트럭션이 실행될 필요가 없다.
    • 낮은 익셉션 레벨에서 높은 레벨로 진입 하려면 익셉션 유발을 해야하는데 그 과정에서 레지스터를 백업하거나 해야함
  • 그래서 부팅하면서 익셉션 레벨이 점점 낮아진다.

Armv8 아키텍처에서 익셉션을 처리하는 방식

익셉션이 발생했다고 감지하면 익셉션 종류별로 이미 정해 놓은주소로 브랜치
이미 정해진 주소를 익셉션 벡터(Exception Vector) 주소라 하며, 각 익셉션의 종류에 따라 익셉션 벡터 주소의 위치가 다름
익셉션 벡터 주소에는 익셉션을 핸들링하는 코드가 있음

  • 인터럽트를 익셉션이라고 부르는 경우는 거의 없다. 크래쉬 => 익셉션 (메모리 어보트) 페이지 폴트 => 익셉션?

  • arm에서는 인터럽트도 하나의 익셉션으로 판단

  • 인터럽트 : 외부 페리페럴 디바이스에서 인터럽트를 유발하게 되면 칩 내부의 제네릭 인터럽트 컨트롤러라는 하드웨어 블럭이 있음. 이것이 인터럽트 시그널을 받은 다음에 arm코어에게 통합해서 시그널로 전달 이를 IRQ라고함

    • FIQ : IRQ보다 높은 순위의 인터럽트 리퀘스트. IRQ는 시큐어 인터럽트로 처리함.
      • 시큐어 인터럽트 : 트러스트존 기준에서 보면 일반적으로 IRQ큐는 non-secure , FIQ는 secure 인터럽트
  • 어보트 : 데이터 오버트 - 널 포인트 엑세스를 할 때 유발 => LDR이라는 명령어가 실행, 인스트럭트 어보트 - 스택이 깨졌을 때 발생, 해당 함수의 실행이 마무리되고 RET명령을 실행할 때(프로세스의 스택의 공간에 있는 x30레지스터의 값이 pc로 업데이트 되는데 이 값이 스택에 push해서 저장이 되는데 이 값이 오염되면 이 어보트가 발생.
    어보트는 mmu에 의해 생성 , 유효하지 않은 주소에 접근하면 MMU가 어보트 유발

커널 패닉 로그

  • lkdtm_익셉션: lkdtm이란 드라이버에서 발생 => 어보트발생 => die (리셋)
    • fault 핸들러 수행 => 커널로그에 레지스터 정보 뿌려줌 => 시스템 리셋이됨

IRQ Handling

  • finish task switch : 인터럽트가 유발된 동작

page fault

function_trace.-1835 [003] ..... 6916.425557: __handle_mm_fault+0x4/0x9c0 <-handle_mm_fault+0x1c4/0x2e0
function_trace.-1835 [003] ..... 6916.425558: <stack trace>
=> __handle_mm_fault+0x8/0x9c0
=> handle_mm_fault+0x1c4/0x2e0 /
=> do_page_fault+0x1f4/0x480
=> do_mem_abort+0x48/0x98
=> el0_da+0x48/0xa0
=> el0t_64_sync_handler+0x68/0xc0
=> el0t_64_sync+0x18c/0x190

system call

bash-1609 [001] ..... 1680.296714: copy_process+0x4/0x14f8 <-kernel_clone+0x98/0x3f8
bash-1609 [001] ..... 1680.296719: <stack trace>
=> copy_process+0x8/0x14f8
=> kernel_clone+0x98/0x3f8
=> __do_sys_clone+0x6c/0x98
=> __arm64_sys_clone+0x28/0x38 
=> invoke_syscall+0x4c/0x110
=> el0_svc_common.constprop.3+0xfc/0x120
=> do_el0_svc+0x34/0xd0
=> el0_svc+0x30/0x88
=> el0t_64_sync_handler+0x98/0xc0
=> el0t_64_sync+0x18c/0x190
post-custom-banner

0개의 댓글