ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [공PD의 컴퓨터 구조] 인터럽트 (Interrupt) 란? 인터럽트 종류와 처리(Interrupt Service Routine, Interrupt handler)
    하드웨어 스케치북 2020. 4. 13. 01:34
    반응형

     

    그 동안 너무 전문적인, 어떻게보면 지엽적인(?) 컨텐츠로 포스팅을 진행했던 것 같다. 

    아무래도 ARMv7을 기반으로 하는 마이크로 컨트롤러를 사용하시는 분들이 많고, SoC를 다루시는 분들이 아무래도 적기 때문에 포스팅을 보시는 분들에게 도움이 되고자 기초를 다루는 포스팅도 번갈아 가며 올리는 것이 좋을 것 같다는 생각을 하게 되었다.

     

    그래서 이번시간에는 인터럽트 (Interrupt) 에 대해서 포스팅을 해 보려고 한다.

     

    간단하지만 굉장히 중요한 내용이며, 현업에서 뿐만아니라 각종 시험이나 면접에서 단골로 등장하는 내용이므로 꼭 숙지하였으면 좋겠다.

     

     

     

     


    전자과나 컴퓨터공학, 정보통신공학 등을 전공하는 공대생들은 2학년 혹은 3학년이 되면 "컴퓨터 구조" 라는 과목을 듣게 된다. 학교마다 수업이름은 다르겠지만 보통 "Computer Architecture & Organization" 이라는 이름으로 개설이 되는 것으로 알고 있다.

     

    이 수업에서 주로 컴퓨터의 구조와 각각의 구성요소, 그들의 역할과 CPU에 대해서 배운다.

     

    그 중 CPU 동작의 핵심 요소 중 하나인 인터럽트에 대해서 알아볼 것이다.

     

    인터럽트 란? (Interrupt)

     

    우선 영어 단어의 뜻을 알아보자

     

    Interrupt 미국·영국 [ˌɪntəˈrʌpt]

    : 방해하다, 중단시키다

     

    단어의 뜻에서 알 수 있듯이 어떤 일이나 행동을 '방해하는' 행위를 말한다.

     

     

     

    두산 백과에서는 이렇게 설명하고 있다.

     

    "컴퓨터 작동 중에 예기치 않은 문제가 발생한 경우라도 업무 처리가 계속될 수 있도록 하는 컴퓨터 운영체계의 한 기능"

     

    컴퓨터 프로그램이 작동중에 어떤 문제가 발생했을 때, 이 문제를 해결하고 다시 돌아와 원래 수행하던 프로그램을 다시 수행하도록 만드는 메커니즘이다.

     

    이 때 "예기치 않은 문제" 가 무엇이냐는 동작하는 CPU의 아키텍쳐에 따라 달리질 수 있다.

     

    간단히 예를 들어보면 우리가 스마트폰을 이용해서 유튜브를 시청하고 있었는데, 갑자기 전원 버튼을 누르면 화면이 꺼지면서 대기 상태로 돌아가게 된다.

     

    이 때 '전원을 누르는 행위' 는 프로그램의 입장에서 '예기치 않은 문제' 이고, 인터럽트를 발생시킬 수 있는 인터럽트 소스 (Interrupt source)가 될 수 있다.

     

    프로그램이 유튜브 영상을 재생하기 위해서 CPU는 이러한 일을 할 것이다.

     

    CPU: "야 모뎀이나 와이파이! 너네가 유튜브 홈페이지에서 보내는 정보를 받아와서 GPU한테 전달해 줘! 그리고 GPU 너는 받은 data를 렌더링 해서 영상을 만들어 내고 display system에 디스플레이 data를 보내!"

     

    이렇게 되면 GPU와 Display system이 열심히 그래픽을 처리하면서 액정에 그래픽 정보를 전달해 주고 있을 것이다. 이렇게 데이터 전송이 이루어지는 상황에서 전원 버튼을 누르게 되면, 데이터 전송을 멈추고 검은 대기 화면을 띄워야 하는 것이다. 검은 대기화면을 띄우면 다시 전원을 키는 상태를 기다리게 되고, 다시 전원 버튼을 누르게 되면 화면 잠금이 풀리고 다시 재생하던 영상을 재생하게 될 것이다.

     

    이 일련의 과정은 하드웨어 입장에서 아래와 같은 그림을 거쳐서 이루어지게 된다.

     

     

     

    프로그램은 CPU의 program counter (PC) 에 의해 명령어 (Instruction)을 처리하게 된다.

    이렇게 명령어를 하나씩 메모리에서 가져와서 실행하다가 인터럽트가 발생하게 되면 현재 수행하던 프로그램과 프로세서의 상태를 저장하고 Interrupt handler 라고 하는 인터럽트 처리기로 점프하게 되고, 이 인터럽트 처리기가 Interrupt Service Routine (ISR)이라는 인터럽트 처리 동작을 수행하게 되고, 이 인터럽트 처리 동작이 완료되면 인터럽트 처리기가 다시 원래 수행하던 프로그램으로 Return 하여 이전 상태로 프로그램과 프로세서 상태를 가져와서 수행하게 된다.

     

    이렇게 전원 버튼을 누르는 것처럼 인터럽트 소스에는 굉장히 많은 것들이 포함될 수 있다. 

    홈 버튼을 누르는 것이라던지, 볼륨 버튼으로 볼륨을 키우고 줄이는 행위라던지...

     

    이처럼 인터럽트에는 많은 종류들이 있다.

    H/W (CPU)의 입장에서 Interrupt를 하나하나 정의해서 인터럽트를 처리하는 Interrupt controller에 mapping을 시켜 놓을 수도 있으며, S/W interrupt를 위해 interrupt controller에 예비 interrupt source를 mapping 시킬 수 있다.

     

    인터럽트의 종류의 예를 들면 아래와 같은 것들이 있을 수 있겠다.

     

    External Interrupt (외부 인터럽트):

    System과 연결된 외부 I/O (PCIe, UART, I2C, USB) 등으로부터 전송되는 data의 시작이나 종료를 알리는 경우, 혹은 기타 버튼에 의해 제어되는 경우

    -> 이 경우는 H/W 적으로 수행되는 것이기에 H/W interrupt의 범주에 들어간다고 볼 수 있다.

     

    Hardware Interrupt (H/W 적으로 필요한 기능을 구현해 놓은 인터럽트):

    어떤 동작의 수행을 위해 Watchdog timer나 다른 timer를 setting 해 두고 정해진 시간이 되었을 때 interrupt를 발생시키는 경우

     

     

    Software Interrupt (S/W에서 특정 동작을 위해 구현해 놓은 인터럽트):

    특정 Application program에서 메모리 접근 권한이나 기타 I/O 디바이스의 자원 할당을 위해 접근 권한을 요청하는 경우 - 카메라 어플리케이션을 설치후 실행했을 때 메모리나 카메라에 접근 권한을 요청하는 팝업이 이 경우

    (이를 Supervisor Call, SVC라고 부르며 application은 system의 자원에 접근할 수 없기 때문에 운영체제(OS)를 통해 이 application이 사용할 자원을 할당해 주는 일을 수행한다)

     

     


    인터럽트에 대해 검색을 하다 보면 많은 정보들이 나오는데, 현업의 입장에서 실제 와닿는 정보는 크게 많지 않고 example이 없다면 머리로는 이해를 해도 실제로 어떻게 수행되는지 그림이 잘 그려지지 않는 경우가 있다.

     

    그래서 간단한 example을 들어 정리하고 마칠 계획이다.

    여기서 등장하는 example의 CPU는 ARM 기준.

     

    인터럽트 상황

    : 유튜브 동영상을 보다가 볼륨 상향 버튼이 눌린 경우 (CPU가 1개인 싱글코어라고 가정하자)

     

    앞서 설명한 것처럼 유튜브 동영상을 시청하고 있을 때에 CPU는 네트워크 시스템과 GPU, 디스플레이 시스템에게 명령을 내리고 있을 것이다.

     

    example system architecture

     

    "네트워크 시스템으로부터 유튜브 영상 data를 받아서 GPU에게 보내고, GPU가 처리한 그래픽 data를 디스플레이 시스템이 액정 화면에 표시되게 하는 일을 계속 해!"

     

    이 때 볼륨 버튼을 누르면, 이 행위가 인터럽트 소스가 된다.

     

    이 때 CPU는 인터럽트가 발생했다는 사실을 인터럽트 컨트롤러로 부터 전달받게 된다. 인터럽트 컨트롤러는 미리 mapping시켜 놓은 Interrupt source로부터 인터럽트가 발생했음을 받고 CPU에 Interrupt 처리를 요청하게 된다. 이를 IRQ (Interrupt Request)라고 한다.

     

    CPU는 Interrupt request를 받으면 미리 지정해 놓은 Interrupt handler를 호출해야 하고, 이 Interrupt handler에 대한 코드는 CPU의 특정 메모리 영역에 저장되어 있어 이 코드를 수행하게 한다.

     

    이처럼 CPU의 특정 메모리 영역에 인터럽트 핸들러를 위치시키는 것을 Vector table이라고 하며, 이 Vector table은 CPU가 빠질수 있는 예외 상황, 즉 익셉션 (Exception)이라고 불리는 상황이 발생했을 때 특정 code를 수행하라고 알려주는 일을 한다.

     

    여기서 익셉션이란 인터럽트를 포함한 예외 상황을 말하고, 익셉션이 인터럽트를 포함하는 상위 개념 Super set이라고 생각하면 된다.

     

     

    코드로 예를 들어보면

     

    vector table을 아래와 같이 작성했다고 치자. 이 코드는 System의 어느 메모리 영역에 위치시켜 놓아야 한다.

     

    [Vector table example]

     

    ...

     

    .align 128

     

    volume_up_irq:

                           bl volume_up_isr

                           ret

     

    .align 128

     

    volume_down_irq:

                           bl volume_down_isr

                           ret

    ...

     

    이런식으로 작성이 되어 있으면 volume_up_irq가 발생했을 때 volume_up_isr이라는 service routine으로 bl (branch) 하게 되는 것이다. 이때 내가 branch 이후 다시 돌아올 위치를 link register에 저장하고 branch를 수행하게 되며 이 때의 CPU 상태나 레지스터 정보를 스택(stack)에 push하게 할 수 도 있다.

     

    [stack에 푸시하는 code example]

     

    stp x0, x1 [SP, -0x10] // General Purpose Register를 Stack Pointer가 가리키는 곳에서 0x10만큼 떨어진 곳에 push

     

     

    [ISR example]

     

    void volume_up_isr () {

          audio_volume_set (1, up);

          display (volume_ptr, current_volume);

     

          return ;

    }

     

    이렇게 volume_up에 대한 인터럽트 서비스 루틴 함수를 호출하면 volume_up_isr이라는 함수는 위와 같은 코드를 수행할 것이다. 일단 Audio 시스템에 볼륨을 1 증가시키라고 명령을 내릴 것이고, 오디오 시스템에서는 볼륨을 1 올리는 행위를 ADC (analog to digital converter) 의 voltage를 높이는 것으로 동작을 수행할 것이다. 그리고 우리가 스마트폰에서 볼륨 버튼을 누르면 상단에 볼륨 조절 바가 디스플레이 되는 것을 볼 수 있는데, 이 동작을 위해 화면에 volume 바를 호출하도록 하고, volume 바에 현재 volume (증가된)을 표시해 주도록 명령을 내릴 것이다.

     

    이렇게 정해진 인터럽트 서비스 루틴을 수행하고 나면 다시 원래 상태로 돌아와 그 다음 명령어를 수행하게 되는 것이다.

    반응형

    댓글

Designed by Tistory.