Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

9365
557
421924


[ARM프로세서] ARMv7: 인터럽트 타입 익셉션을 유발할 때 ARM 코어의 세부 동작 Armv7: 익셉션(Exception)

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

 
그림 8.10 인터럽트 타입 익셉션을 유발할 때 변경되는 레지스터 

그림 8.10은 IRQ 인터럽트 익셉션의 전체 실행 흐름을 나타내는데, 그림의 가운데 부분을 보면 ARM 코어가 하드웨어적으로 처리되는 부분이 슈도 코드로 표기돼 있습니다. 이어서 슈도 코드를 분석하면서 ARM 코어의 세부 동작을 알아보겠습니다.

먼저 01번째 줄을 봅시다.

01 R14_irq = 0xc000d000 + 0x4

IRQ 익셉션이 발생했으니 ARM 코어는 IRQ 모드로 변경할 준비를 하는데, 먼저 IRQ 모드에서만 사용되는 R14_irq 레지스터에 인터럽트가 발생한 주소에 0x8를 더해 저장합니다. IRQ 인터럽트가 발생할 시점에 실행된 명령어의 주소가 0xc000d000이니 R14_irq 레지스터는 0xc000d008를 저장합니다. 이어서 02번째 줄을 보겠습니다.

02 SPSR_irq= CPSR

SPSR_irq 레지스터에 인터럽트 익셉션이 발생한 시점의 CPSR 레지스터를 저장합니다. 만약 IRQ 익셉션이 발생할 시점이 슈퍼바이저 모드이면 CPSR 레지스터가 0x6000_0113이니 SPSR_irq 레지스터는 0x6000_0113를 저장하게 됩니다.

다음으로 03번째 줄을 보겠습니다.

03 CPSR[4:0] = 10111

CPSR 레지스터의 [4:0] 비트를 이진수로 '10111'(16진수:  0x17)로 변경해 IRQ 모드로 변경합니다. IRQ 익셉션이 발생할 시점에 CPSR 레지스터가 0x6000_0113이면, 이 시점에 CPSR 레지스터는 0x6000_0117로 변경됩니다.

이어서 05~08번째 줄을 보겠습니다. 

05 if high vector
06   PC = 0xffff_0000 + 0x18
07 else
08   PC = 0x0000_0000 + 0x18

익셉션의 종류 별로 지정된 주소로 프로그램 카운터를 브랜치를 하는 동작인데, 익셉션 벡터 베이스 주소 기준으로 0x18 오프셋만큼 떨어진 주소를 지정합니다.

여기까지 ARM 코어 내부에서 IRQ 익셉션을 유발할 때, 하드웨어적으로 처리되는 동작을 나타낸 슈도 코드를 통해 알아봤습니다.

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






덧글

댓글 입력 영역