Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

11105
637
415734


[ARM] 익셉션이 발생하면 프로세스는 어떻게 동작할까 - ARMv8 Arm: Exception Overview

이번에는 64비트 기반 ARMv8 아키텍처 기준으로 proc_func_ptr 함수의 코드를 봅시다.

01 ffffff8008106d7c <proc_func_ptr>:
02 ffffff8008106d7c:   d10083ff    sub sp, sp, #0x20
03 ffffff8008106d80:   f90007e0    str x0, [sp,#8]
04 ffffff8008106d84:   b90017ff    str wzr, [sp,#20]
05 ffffff8008106d88:   f94007e0    ldr x0, [sp,#8]
06 ffffff8008106d8c:   f9000fe0    str x0, [sp,#24]
07 ffffff8008106d90:   f9400fe0    ldr x0, [sp,#24]
08 ffffff8008106d94:   b9400800    ldr w0, [x0,#8]
09 ffffff8008106d98:   b90017e0    str w0, [sp,#20]
10 ffffff8008106d9c:   b94017e0    ldr w0, [sp,#20]
11 ffffff8008106da0:   910083ff    add sp, sp, #0x20
12 ffffff8008106da4:   d65f03c0    ret

당연한 이야기지만 같은 C 코드를 컴파일을 해도 ARMv7 아키텍처의 명령어와 달라 보입니다.
위 코드 기준으로 proc_func_ptr() 함수에 전달되는 인자인 param이 NULL이면, 다음 08번째 줄을 실행하다가 익셉션이 발생합니다.

08 ffffff8008106d94:   b9400800    ldr w0, [x0,#8]

x0 레지스터가 0x0인데 0x0에서 8을 더한 0x8 주소에 접근을 시도하니, ARM 프로세서는 익셉션을 유발하는 것입니다.

ARMv7의 데이터 어보트는 ARMv8 아키텍처에서 "Synchronous" 카테고리로 분류됩니다. ARMv8 아키텍처의 익셉션 벡터 테이블은 ARMv7과 약간 상이하니, 세부적인 내용은 10장을 참고하세요.

ARMv8 기준으로도 proc_func_ptr() 함수를 실행 중인 프로세스 입장에서 데이터 어보트와 같은 익셉션이 발생하면 어떻게 동작하는지 생각해볼까요? 

프로세스 입장에서 실행하는 명령어는 다음과 같습니다.

01 ffffff8008106d7c <proc_func_ptr>:
02 ffffff8008106d7c:   d10083ff    sub sp, sp, #0x20
03 ffffff8008106d80:   f90007e0    str x0, [sp,#8]
04 ffffff8008106d84:   b90017ff    str wzr, [sp,#20]
05 ffffff8008106d88:   f94007e0    ldr x0, [sp,#8]
06 ffffff8008106d8c:   f9000fe0    str x0, [sp,#24]
07 ffffff8008106d90:   f9400fe0    ldr x0, [sp,#24]
08 ffffff8008106d94:   b9400800    ldr w0, [x0,#8]
09 ffffff8008082200:   d10503ff    sub sp, sp, #0x140

08번째 줄에 보이는 ffffff8008106d94 주소의 ' ldr w0, [x0,#8]' 명령어를 실행하다가, 09번째 줄의 ffffff8008082200 주소로 프로그램 카운터가 바뀌게 되는 겁니다. 결국 프로세스 입장에서는 뭔가 순간 이동이 되는 듯한 느낌을 받을 겁니다.

프로세스 입장에서는 08~09번째 줄 사이에 무슨 일이 일어났는지 모를 겁니다.
이해를 돕기 위해 아래와 같이 어셈블리 명령어 사이에 보이는 09번째 줄의 주석을 봅시다.

01 ffffff8008106d7c <proc_func_ptr>:
02 ffffff8008106d7c:   d10083ff    sub sp, sp, #0x20
03 ffffff8008106d80:   f90007e0    str x0, [sp,#8]
04 ffffff8008106d84:   b90017ff    str wzr, [sp,#20]
05 ffffff8008106d88:   f94007e0    ldr x0, [sp,#8]
06 ffffff8008106d8c:   f9000fe0    str x0, [sp,#24]
07 ffffff8008106d90:   f9400fe0    ldr x0, [sp,#24]
08 ffffff8008106d94:   b9400800    ldr w0, [x0,#8]
09 // -> ARM 프로세서가 Synchronous(데이터 어보트) 익셉션을 감지한 후 유발
10 ffffff8008082200:   d10503ff    sub sp, sp, #0x140

프로세스 입장에서는 익셉션이 발생하는 어떻게 동작하는지 어셈블리 명령어를 분석하면서 알아봤습니다. 이어지는 절에서는 역시 프로세스의 관점에서 익셉션이 발생했을 때 실행되는 익셉션 벡터가 어디서 실행되는지 알아봅시다.

Reference: ARM 프로세서 익셉션 소개

익셉션이란? 
익셉션의 주요 개념  
    ❑ 익셉션의 타입 소개
익셉션과 같이 배워야 하는 운영체제 지식



Written by <디버깅을 통해 배우는 리눅스 커널의 구조와 원리> 저자



핑백

덧글

댓글 입력 영역