EL0 : 유저 애플리케이션 / PL0 /unprivilege level(시스템 설정 제한)
EL1 : 운영체제의 커널 / PL1 / 인터럽트, MMU, 캐시 기능을 설정
EL2 : 하이퍼바이저 / PL2 / 게스트 OS끼리 스위칭하고 게스트 OS의 시스템 리소스에 접근
EL3 : 시큐어 모니터 모드 / PL3 / Highest privilege level
EL0 , EL1은 필수
EL3 모니터 : 시큐어와 논시큐어를 스위칭하는 익셉션 레벨
트러스트존
익셉션 레벨의 개념 위에 트러스트존이 구성됨
트러스트존에 진입하기 위해서는 EL1에서 EL3로 진입(SMC)해야 함
유저 애플리케이션이 실행
unprivileged 레벨 혹은 PL0로 실행
EL0에서는 인터럽트, MMU, 캐시 기능을 설정할 수 없음
EL1은 PL1 권한이 있는 익셉션 레벨
리눅스 커널에서는 인터럽트, MMU, 캐시 설정과 같이 시스템을 설정 가능
PL2는 EL2에게 부여되는 권한 레벨로 게스트 OS끼리 스위칭하고 게스트OS의 시스템 리소스에 접근 가능
일반적으로 EL2에서 하이퍼바이저가 실행되며, 하이퍼바이저는 PL2 권한레벨로 실행됨
PL3는 EL3에게 부여되는 권한 레벨로 highest privileged level임
시스템을 모두 설정할 수 있고, 익셉션 레벨에 존재하는 모든 레지스터에
엑세스할 수 있어 Booting 과정에서 EL3로 설정
익셉션이 발생했다고 감지하면 익셉션 종류별로 이미 정해 놓은주소로 브랜치
이미 정해진 주소를 익셉션 벡터(Exception Vector) 주소라 하며, 각 익셉션의 종류에 따라 익셉션 벡터 주소의 위치가 다름
익셉션 벡터 주소에는 익셉션을 핸들링하는 코드가 있음
인터럽트를 익셉션이라고 부르는 경우는 거의 없다. 크래쉬 => 익셉션 (메모리 어보트) 페이지 폴트 => 익셉션?
arm에서는 인터럽트도 하나의 익셉션으로 판단
인터럽트 : 외부 페리페럴 디바이스에서 인터럽트를 유발하게 되면 칩 내부의 제네릭 인터럽트 컨트롤러라는 하드웨어 블럭이 있음. 이것이 인터럽트 시그널을 받은 다음에 arm코어에게 통합해서 시그널로 전달 이를 IRQ라고함
어보트 : 데이터 오버트 - 널 포인트 엑세스를 할 때 유발 => LDR이라는 명령어가 실행, 인스트럭트 어보트 - 스택이 깨졌을 때 발생, 해당 함수의 실행이 마무리되고 RET명령을 실행할 때(프로세스의 스택의 공간에 있는 x30레지스터의 값이 pc로 업데이트 되는데 이 값이 스택에 push해서 저장이 되는데 이 값이 오염되면 이 어보트가 발생.
어보트는 mmu에 의해 생성 , 유효하지 않은 주소에 접근하면 MMU가 어보트 유발
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
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