ARM 코어가 ‘svc’ 명령어를 실행하면 소프트웨어 인터럽트를 유발합니다. 다음 그림을 보면서, 소프트웨어 인터럽트가 발생할 때 ARM 코어의 세부 동작을 알아봅시다.

그림 8.11 소프트웨어 인터럽트를 유발할 때 변경되는 레지스터
그림 8.11은 소프트웨어 인터럽트 익셉션이 실행되는 흐름을 나타내는데, 그림의 가운데 부분을 보면 ARM 코어가 하드웨어적으로 처리되는 부분이 슈도 코드로 표기돼 있습니다. 이 슈도 코드 분석을 통해 ARM 코어의 세부 동작을 알아보겠습니다.
먼저 01번째 줄을 봅시다.
01 R14_svc = 0xc000d000 + 0x4
'svc' 명령어를 ARM 코어가 디코딩을 하면 ARM 의 동작 모드를 슈퍼바이저 모드로 변경할 준비를 합니다. 먼저 슈퍼바이저 모드에서만 사용되는 R14_svc 레지스터에 'svc' 명령어를 실행한 주소에 +4를 더해 저장합니다. 만약 'svc' 명령어가 실행된 코드의 주소가 0xc000d000이면, R14_svc 레지스터는 0xc000d004를 저장합니다.
이어서 02번째 줄을 보겠습니다.
02 SPSR_svc= CPSR
SPSR_svc 레지스터에 슈퍼바이저 콜이 발생한 시점의 CPSR 레지스터를 저장합니다. 대부분 User 모드에서 'svc' 명령어를 실행해 슈퍼바이저 콜을 실행합니다. User 모드에서는 CPSR 레지스터가 0x6000_0110이니, SPSR_svc 레지스터는 0x6000_0110을 저장합니다.
다음으로 03번째 줄을 보겠습니다.
03 CPSR[4:0] = 10111
CPSR 레지스터의 [4:0] 비트를 이진수로 '10011'로 변경해 슈퍼바이저 모드로 변경합니다.
슈퍼바이저 콜이 발생할 시점에 CPSR 레지스터가 0x6000_0110이면, 이 시점에는 CPSR 레지스터가 0x6000_0113로 변경됩니다.
이어서 05~08번째 줄을 보겠습니다.
05 if high vector
06 PC = 0xffff_0000 + 0x08
07 else
08 PC = 0x0000_0000 + 0x08
익셉션의 종류 별로 지정된 주소로 프로그램 카운터를 브랜치를 하는 동작인데, 익셉션 벡터 베이스 주소 기준으로 0x08 오프셋만큼 떨어진 주소를 지정합니다.
여기까지 ARM 코어 내부에서 하드웨어적으로 처리되는 동작을 나타낸 슈도 코드를 설명했습니다.
Written by <디버깅을 통해 배우는 리눅스 커널의 구조와 원리> 저자

최근 덧글