본문 바로가기

무언가 만들기 위한 지식/ARM Processor

SWI(Software Interrupt)

인터럽트(interrupt)란 어떤 장치가 다른 장치의 일을 잠시 중단시키고 자신의 상태 변화를 알려 주는 것이다. 인터럽트가 걸리면 인터럽트를 받은 장치는 현재 자신의 상태를 기억시켜두고 인터럽트 처리를 진행한다.
                                                                                                                                                  - by 위키백과


인터럽트가 발생하면, 이전에 언급했던 벡터테이블(0x0에 위치한 Exception Vector Table)로 이동하여 해당 인터럽트에 해당하는 1워드(4byte)명령을 수행하게 되고, Interrupt Handler이동하여 처리하게 된다.

이 과정에서 중요한 역할로 Handler에서 다른 작업을 수행하기 전에 이전 Context를 보존해주어야 하고, Handler에서 모든 작업이 끝나면 다시 이전 Context를 복구해주어야 한다.

보존하는 과정으로는 사용된 Register를 Stack에 저장함으로써 이루어지면, 이러한 과정에서 일종의 규칙이 존재한다.
(Context Switching이라고 함.)

용어상 인터럽트(Interrupt)는 하드웨어적인 흐름의 변화를 말하고, 트랩(Trap)은 소프트웨어적인 흐름의 변화를 말한다.

ARM에서 발생하는 Exception중에서 IRQ와 FIQ, SWI 3개의 인터럽트가 존재한다.
(Reset, Data Abort, Prefetch Abort, Undefined는 인터럽트가 아닌 예외처리 중 하나라고 생각하겠다. - 그러나 기본 개념은 비슷하다./발생원인이 다르기 때문에 따로 분류)

IRQ의 경우 Device Register에 irq가 발생하도록 Set을 해 놓으면(예를 들면 터치 LCD 초기화에서 irq를 받아들이도록 설정),
해당 신호가 발생하면 IRQ 벡터테이블에 접근한후 irq Handler로 이동한다. 그후 핸들러상에 존재하는 처리 Table을 참고하여 해당 작업을 수행하게 된다.

이러한 과정은 3개 모두 비슷하며, 여기서 언급할 내용은 SWI(software Interrupt)이다.
소프트웨어 인터럽트(스와이=SWI 라고도 부름)는 발생원인이 프로그래머에 의해 계획적으로 호출되는 인터럽트이다. 즉 다른 인터럽트는 하드웨어적으로 신호가 발생하지만, SWI는 프로그래머가 swi라는 명령어를 호출함으로써 인터럽트를 발생시킨다.
IRQ, FIQ등은 사용자가 어느 시점에서 인터럽트가 발생할지 모르기 때문에 각 스크레치 레지스터등을 보존하고 Pipe Line을 통해 전해오는 LR(복귀할 주소)값을 고려해야 하지만 SWI는 그렇지 않다.
※ System Call(시스템 호출=Supervisor Call)을 구현하기 위해 SWI가 주로 사용된다.

각 예외처리의 Handler상에 접근하게 되면, (Handler라는 것은 결국 일종의 처리 코드를 지칭한다. - SubRoutine처럼 구성)
IRQ와 FIQ를 받아들인 것인가에 대해 설정할 수 있다.
ARM Mode상의 CPSR값의 [7:6] bit값을 통해 이를 제어하는데 각 모드마다 다르고, 보통 각 Exception으로 가게 되면 IRQ는 Disable하게 되고, FIQ는 이전 상태를 유지하게 된다.
즉 중복적인 IRQ는 발생하지 않도록 설정하고, 급하거나 꼭 필요한 IRQ일 경우(FIQ)만 허용하여, 특별한 이유없이 중복으로 인터럽트가 호출되는 것을 방지한다.
예를 들자면 Reset이나 Prefetch Abort가 발생했는데 인터럽트가 발생한다면 중요한 일들이 수행이 안되게 될 것이다. 그렇기 때문에 각 Exception의 Handler 처리중에는 인터럽트가 발생하지 않는 것이 좋다.

SWI 경우에도 IRQ는 Disable하고, FIQ는 이전 상태를 유지하도록 설정되어 있다.
SWI의 경우 고려해야 할 것들이 있는데, SWI 호출 후, 다시 SWI가 호출될 수 있다는 것이고, 이는 다른모드 수행중에서도 SWI가 중복 수행될 수 있다는 것이다.
 
이 때 발생하는 문제점들은 다음 포스팅에서 다룬다^_^; 

SWI가 호출되면 발생하는 일을 정리하면 다음과 같다.
1. LR 값에 복귀할 주소가 저장.
2. Mode가 Supervisor모드로 전환(CPSR의 bit값이 바뀜.)
3. Supervisor의 SPSR에 이전 모드의 CPSR(주로 User Mode)의 값이 저장.
4. IRQ는 disable, FIQ는 unchanged로 설정
5. PC 값이 벡터테이블(0x00000008 번지로 이동)상의 SWI 처리 주소값으로 저장.

  

<짤방은 필자가 탐났다 휴인스의 보드.. 하지만 현실은 880,000만원 ㅠ.ㅜ>