이어서 Undefined Instruction 익셉션이 발생하는 전체 흐름을 살펴보면서, 세부 동작을 알아봅시다.

그림 8.9 Undefined Instruction 익셉션을 유발할 때 변경되는 레지스터
그림 8.9는 Undefined Instruction 익셉션의 전체 실행 흐름인데, 그림의 가운데 부분을 보면 ARM 코어가 하드웨어적으로 처리되는 부분이 슈도 코드로 표기돼 있습니다. 이 슈도 코드를 분석하겠습니다.
먼저 01번째 줄을 봅시다.
01 R14_und = 0xc000d000 + 0x4
Undefined Instruction 익셉션이 발생했으니 ARM 코어는 Undefined(UND) 모드로 변경할 준비를 합니다. Undefined(UND) 모드에서만 사용되는 R14_und 레지스터에 Undefined Instruction 익셉션이 발생한 주소에 +4바이트를 더해 저장합니다. 만약 Undefined Instruction 익셉션이 발생한 코드의 주소가 0xc000d000이면 R14_und 레지스터는 0xc000d004를 저장합니다.
[정보]
Undefined Instruction 익셉션은 파이프 라인 구조에서 디코딩 단계에서 발생합니다. 따라서 r14_und 레지스터에는 익셉션이 발생한 명령어의 주소에 +4를 더한 주소가 저장됩니다. 파이프 라인에서 데이터 어보트가 유발되는 세부 내용은 8.4절을 참고하세요.
이어서 02번째 줄을 보겠습니다.
02 SPSR_und= CPSR
SPSR_und 레지스터에 Undefined Instruction 익셉션이 발생한 시점의 CPSR 레지스터를 저장합니다. 만약 Undefined Instruction 익셉션이 발생할 시점이 슈퍼바이저 모드이면 CPSR 레지스터가 0x6000_0113이고, 이 때 SPSR_und 레지스터는 0x6000_0113를 저장하게 됩니다.
다음으로 03번째 줄을 보겠습니다.
03 CPSR[4:0] = 10111
CPSR 레지스터의 [4:0] 비트를 이진수로 '11011'(16진수: 0x1B)로 변경해 Undefined(UND) 모드로 변경합니다. Undefined Instruction이 발생할 시점에 CPSR 레지스터가 0x6000_0113이면, 이 시점에는 CPSR 레지스터가 0x6000_011B로 변경됩니다.
이어서 05~08번째 줄을 보겠습니다.
05 if high vector
06 PC = 0xffff_0000 + 0x4
07 else
08 PC = 0x0000_0000 + 0x4
ARM 코어가 Undefined Instruction 익셉션을 유발할 때, 익셉션 벡터 베이스 주소 기준으로 0x04 오프셋만큼 떨어진 주소로 프로그램 카운터로 브랜치합니다. 이후, 해당 익셉션 벡터에 위치한 코드가 실행됩니다.
여기까지 ARM 코어 내부에서 하드웨어적으로 처리되는 동작을 나타낸 슈도 코드를 설명했습니다.
Written by <디버깅을 통해 배우는 리눅스 커널의 구조와 원리> 저자

최근 덧글