Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

2107
469
422728


[ARM프로세서] ARMv7: 데이터 어보트(Data Abort)를 유발할 때 ARM 코어의 세부 동작 Armv7: 익셉션(Exception)

이어서 다음 그림을 보면서 데이터 어보트가 발생할 때 ARM 코어에서 이를 처리하는 세부 과정을 알아봅시다. 

 

그림 8.8 데이터 어보트 익셉션을 유발할 때 변경되는 레지스터  

ARM 코어가 데이터 어보트를 감지하면, 하드웨어적으로 레지스터를 어떻게 변경하는지, 그림의 가운데 부분에 보이는 슈도 코드를 분석하면서 알아봅시다. 

먼저 01번째 줄을 분석하겠습니다.

01 R14_abt = 0xc000d000 + 0x8

데이터 어보트가 발생했으니 ARM 코어는 어보트 모드로 변경할 준비를 합니다.
[정보]
프리페치 어보트와 데이터 어보트를 유발할 때 공통으로 어보트 모드로 변경된다는 점을 기억합시다.

먼저 어보트 모드에서만 사용되는 R14_abt 레지스터에 데이터 어보트가 발생한 주소에 0x8를 더해 저장합니다. 데이터 어보트가 발생한 코드의 주소가 0xc000d000이니 R14_abt 레지스터는 0xc000d008를 저장합니다. 

[정보]
데이터 어보트는 파이프 라인 구조에서 실행 단계에서 발생합니다. 따라서 r14_abt 레지스터에는 익셉션이 발생한 명령어의 주소에 +8을 더한 주소가 저장됩니다. 파이프 라인에서 데이터 어보트가 유발되는 세부 내용은 8.4절을 참고하세요. 


이어서 02번째 줄을 보겠습니다.

02 SPSR_abt= CPSR

SPSR_abt 레지스터에 데이터 어보트가 발생한 시점의 CPSR 레지스터를 저장합니다.
만약 데이터 어보트가 발생할 시점이 슈퍼바이저 모드이면 CPSR 레지스터가 0x6000_0113이고, 이 때 SPSR_abt 레지스터는 0x6000_0113를 저장하게 됩니다.

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

03 CPSR[4:0] = 10111

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

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

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

ARM 코어가 데이터 어보트를 유발할 때, 익셉션 벡터 베이스 주소 기준으로 0x10 오프셋만큼 떨어진 주소로 프로그램 카운터로 브랜치합니다. 참고로, 익셉션의 종류 별로 브랜치되는 익셉션 벡터의 오프셋은 익셉션 벡터 테이블에서 확인할 수 있습니다. 

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






덧글

댓글 입력 영역