상세 컨텐츠

본문 제목

인터럽트

CS지식 학습

by Tabris4547 2024. 3. 13. 09:27

본문

728x90

 

인터럽트는 무엇일까?

인터럽트를 사잔적으로 보면

'방해하다' 라는 뜻을 가지고 있습니다.

대학시절에 어떤 교수님이 

"이해 안되면 interrupt걸어주세요"라고 하셨는데

이 말은 '수업방해하세요'라는 의미는 아니고

"중간에 손들어서 질문해주세요"라는 의미입니다.

여러분들이 스마트폰을 쓰고 있습니다.

유튜브를 보고있다가 카톡이 왔습니다.

카톡 메세지 창을 누르면 유튜브가 일시정지되고

카톡으로 넘어갑니다.

유튜브라는 프로세스를 실행하던 도중

터치라는 인터럽트가 발생하였고

그 인터럽트 결과에 따라 카톡으로 이동한 것입니다.

 

 

인터럽트는 왜 알아야할까?

 

방금 전의 스마트폰 사례로 알 수 있듯이

인터럽트가 어떻게 발생하고 그에 따른 동작이 뭔지 알면

시스템을 잘 이해할 수 있습니다.

스마트폰에 터치 외에도 버튼/소리 등등 다양한 인터럽트기능이 있겠죠?

각 인터럽트가 발생했을때에 어떻게 실행흐름이 되는지 알면

프로세스가 어떻게 동작하는지 이해하고

그에 따른 CPU 아키텍쳐가 어떻게 동작하는지 이해하게 되면서

더욱 풍부하게 컴퓨터를 이해하게 됩니다.

 

인터럽트는 어떤 흐름으로 호출이 될까?

 

 

디바이스별로 인터럽트가 실행되는 과정을 그림으로 그렸습니다.

hw단에서 인터럽트가 발생하면

리눅스 커널에 익셉션 백터를 봅니다.

해당 백터값을 통해

"어떤 인터럽트를 호출할지"볼 수 있습니다.

그 후, 리눅스 커널의 인터럽트 함수를 통해

각각의 디바이스 드라이버에게

그에 맞는 인터럽트 결과를 보냅니다.

(다른 영역으로 인터럽트를 보내는 함수를

'인터럽트 핸들러'라고 합니다)

 

 

자세하게 함수실행흐름으로 그리면 다음과 같습니다.

 

인터럽트 컨텍스트(with ftrace)

 

인터럽트를 처리한다는 뜻입니다.

인터럽트가 발생하면 핸들링하는 코드를 빠르게 실행해야하기 때문에

이와 같은 용어를 정의했습니다.

ftrace 메세지 일부입니다.

여기서 어느 부분이 인터럽트 컨텍스트일까요?

메세지 앞 쪽에, h라고 적혀있으면 

인터럽트컨텍스트가 발생한다는 의미입니다.

뒤를 보면 irq_handler라는 인터럽트 핸들러가 발생하고있습니다.

이를 통해, 다음에 nop_trace.sh라는 프로세스가 실행됨을 알 수 있습니다.

 

인터럽트는 왜 빨리 실행되어야할까?

 

그 이유는 현재 실행중인 코드가 멈추기 때문입니다.

만약 유튜브를 보고 있는데

메세지 알람이라는 인터럽트가 왔다고 가정해보겠습니다.

인터럽트가 느린다면 메세지 알람을 실행하는 동안의 과정이 길게 되겠고

사용자입장에서는 유튜브가 끊기는 느낌을 받게 됩니다.

즉, 인터럽트동안에는 원래 코드의 실행을 중지해야하기 때문에

'인터럽트는 빨리 실행되어야한다'라는 말이 나오게 되었습니다.

 

 

인터럽트 후반부 기법

 

방금 전까지 '인터럽트는 빨리 실행되어야한다'라고 배웠습니다.

그런데, 만약 인터럽트처리를 해야할 동작이 뭉탱이로 있다면?

살펴보니 어떤 동작은 굳이 급하게 처리하지 않아도 되는 걸 발견했습니다.

예를들면 터치는 우선순위가 매우 높은데

카톡알람은 굳이 높을 필요가 없다는 걸 발견한거죠.

이처럼 급하게 처리하지 않아도 되는 일은 조금 뒤에 처리하는 것이

인터럽트 후반부 기법입니다.

Top Half는 빨리 처리해야하는 일로,

인터럽트핸들러로 처리하는 일을 뜻합니다.

반면 Bottom Half는 조금있다가 처리해도 되는 일로,

프로세스 레벨에서 수행하는 일을 뜻합니다.

 

 

프로그램으로 인터럽트 디스크립터 분석해보기

 

Crash Utility

irq 명령어를 입력하면 인터럽트가 일어난 순서대로

irq 디스크립터 정보가 나열되는 걸 볼 수 있습니다.

 

struct irq_desc (irq_desc주소)를 입력하면

해당 irq디스크립터의 정보를 출력할 수 있습니다.

 

 

Trace 32

 

Trace 32로 irq디스크립터를 캐스팅했습니다.

crash utility보다 정보를 보는게 수월합니다.

 

handle_irq라는 필드를 보면, 

해당 인터럽트를 핸들링하는 인터럽트핸들러를 확인할 수 있습니다.

 

도움자료

디버깅을 통해 배우는 리눅스 커널의 구조와 원리

ARM 아키텍처의 구조와 원리

프로그래머스 데브코스 리눅스커널 전문가 과정

728x90

관련글 더보기

댓글 영역