본문 바로가기

CS/[Embedded]Embedded System Software

[Embedded]Interrupt Handling

Interrupt

OS kernel의 주요 역할로는 시스템 하드웨어를 관리하는 작업이 있다. HDD, LAN, 마우스, 키보드 등 각 장치와 통신을 해야 하드웨어를 관리할 수 있는데, 이러한 하드웨어와의 통신 속도는 processor 속도에 비해 많이 느려 하드웨어 응답까지 커널이 기다리는 방식은 비효율적이다.

 

이러한 문제점 해결하는 방법 중 하나는 polling이다. Polling은 커널이 주기적으로 시스템 하드웨어의 상태를 확인하고, 그 상태에 따라 처리하는 것을 말한다.

하지만 이러한 방법도 하드웨어의 상태를 주기적으로 확인해야 하는 overhead가 발생하게 되고 불필요한 부하가 생기게 된다. 

 

따라서 더 효율적인 방법으로는 하드웨어가 커널에 신호를 보낼 수 있는 체계가 있다. 이를 Interrupt라고 한다.

 

하드웨어는 Interrupt를 이용해 프로세서에 신호를 보내게 되는데, 예를들어 키보드를 두드리면 키보드 컨트롤러가 프로세서에 전기적 신호를 보내고 프로세서는 신호를 보내 키가 눌렸다는 사실을 OS에 알려준다.

 

이러한 interrupt는 클럭에 비동기 적으로 발생할 수 있다.

신호를 감지하면 프로세서는 interrupt를 처리하기 위해 하던 일을 중단한다. 이후 프로세서는 os에 interrupt 발생 사실을 알리고, 상황에 맞게 OS가 interrupt를 처리한다.

 

각 interrupt 별로 고유 값을 할당할 수 있으며, 장비에 따라 다른 interrupt를 할당할 수 있다. 운영 체제는 interrupt를 구별하고 ,interrupt 발생 HW가 어떤 것인지 식별한다.

 

또한, 운영체제는 각 interrupt에 맞는 적절한 handler를 이용하여 처리 가능하다. 이러한 interrupt 값을 IRQ(interrupt Request) Line이라고 하고 번호가 붙어있다.

 

cf) exception과 interrupt의 차이, 특징

-interrupt와 달리 exception은 프로세스 clock에 동기적이다. 동기화된 interrupt라고 부르는 경우도 많다.

-프로그래밍 오루(0으로나누기) 혹은 커널의 비정상적 처리(page 접근 오류) 등이 발생했을 때 exception이 발생한다.

-interrupt와 유사한 방식으로 exception을 처리하여 두가지를 처리하는 구조가 비슷하다.

 

Interrupt(HW perspective)

 

만약 다양한 hw interrupt 가 동시에 요청이 되면 어떻게 요청을 처리할까?

이러한 처리를 해주는 것이 PIC(Programmable Interruptible Controller)이다. 말 그대로 interrupt controller 로서 여러 장치들이 연결되어 있고, 이러한 여러 interrupt를 처리해 준다.

 

각 장치 들은 IRQ line 을 통해 PIC에 연결되어 있으며 IRQ line을 통해 PIC에 interrupt request를 한다.

 

위 경우는 x86 system에서 single cpu case 의 경우를 나타낸 것으로 두개의 pic가 master-slave 방식으로 연결되어 15개의 입력 처리가 가능한 경우이다.

 

Processor는 INTR과 INTA 두 line이 존재하며 INTR Line은 PIC의 INT pin 과 연결되어 interrupt 발생 시 INT pin 에 신호를 발생시켜  processor 가 처리할 수 있도록 한다.

INTA line은 interrupt 가 processor 에 잘 전달 되었음을 processor 가 pic에 신호를 보내는 line 이다.

 

이 때 interrupt를 three level 에서 enable, disable 처리가 가능한데,

다음과 같다. 

 

먼저 device level 에서는 말 그대로 device 자체에서 control register를 직접 control을 하는 것이다. 따라서 pic는 Interrupt 발생 여부도 모르는 상황이 되는 것이다.

pic level 에서는 pic로 interrupt 신호는 오게 되지만, pic 자체에서 IRQ line을 disable 하게 되면서, interrupt를 disable 하게 된다.

마지막으로 cpu level 에서는 cpu instruction을 활용하여 disable 하는 것이다.

 

각각의 interrupt는 priority가 존재하게 되고 PIC에 의해 control이 된다. PIC는 우선순위가 높은 장치를 선정하여 processor에게 전달하게 된다.

 

 linux에서는 interrupt priority를 지원하지 않는데, RTLinux의 경우에는 interrupt priority를 지원한다

 

Interrupt handling

processor는 startup 부터 shutdown 될 때 까지 단순히 instruction을 한번에 하나씩 처리하는 작업을 한다.

이러한 sequence CPU's control flow(flow of control)이라고 한다.

 

이렇게 flow 대로 processor가 program counter(PC)에 의해 명령어 (instruction)을 처리하게 되는데,

이렇게 명령어를 하나씩 처리하던 도중 interrupt 가 발생하게 되면 진행하던 process의 상태를 저장하고 interrupt에 대한 처리인

interrupt handling 을 하게 된다. 

 

interrupt 를 처리하기 위해 커널이 실행하는 함수를 interrupt handler라고 하며, interrupt service routine이라고도 부른다. 

각 장치의 interrupt handler는 각 장치의 device driver에 포함되어 있다. 

 

interrupt 가 실행되는 context는 interrupt context라고 하며 해당 context 진행시에는 실행을 중단 시킬 수 없기 때문에 atomic context라고도 한다. 

 

중단된 코드를 최대한 바로 다시 실행하기 위해서는 handler의 처리 속도가 빨라야 한다. 즉, 시스템의 다른 부분 입장 에서는 handler의 실행시간이 가능한 짧은 것이 중요하다.

 

최소한 handler는 interrupt를 받았따는 사실은 하드웨어에 알려주어야 하고, 이외의 일을 해야하는 경우가 있다. 예를 들어, network 장치의 interrupt의 경우 network packet을 받아왔다면 메모리로 복사하고 처리 작업을 수행 하는 등 작업에 시간이 상당히 걸리게 된다.

 

따라서 interrupt handling의 경우 작업에 상당한 시간이 걸리게 되면 ,interrupt는 최대한 빠르게 처리해야 하므로 작업을 전반부, 후반부로 나누어 진행한다.

 

이는 뒤에 따로 자세히 알아보도록 하겠다.

 

 

Interrupt Handling

▪ A signal that the hardware sends when it wants the processor’s attention.

▪ Since it is almost always undesirable to have the processor wait on external events, there must be a way for a device to let the processor know when something has happened.

 

interrupt flow는 위 그림과 같다.

 

process는 flow를 진행하다가 interrupt 가 발생하게 되면 해당 flow를 멈추고 interrupt vector table로 넘어가게 된다.

interrupt에는 여러가지 종류가 있는데 vector table에서 해당하는 interrupt service routine(interrupt handler) 를 호출하게 된다.

 

이후 interrupt service routine을 진행하게 되는데 말 그대로 interrupt를 처리하는 루틴으로 실행 중이던 processor의 state를 저장을 먼저 하고, 

interrupt handling을 진행한다.

 

이후 처리가 끝나면, 다시 저장했던 processor state를 가져와 원래 상태로 복귀하게 된다.