ARM Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

202239
1625
172599


[리눅스커널] 인터럽트 후반부 처리(Bottom Half) 소개 6. 인터럽트 후반부 처리

우리는 "인터럽트가 발생하면 인터럽트 핸들러는 빨리 실행해야 한다."고 배웠습니다. 그런데 인터럽트 핸들러에서 처리해야 할 일이 많을 때는 어떻게 해야 할까요? 

    인터럽트 후반부 기법을 적용하면 된다.

이번 절에서는 인터럽트 후반부에 대해 소개합니다.

인터럽트 후반부 기법을 적용하는 이유
인터럽트 핸들러(인터럽트 컨택스트)에서 스케줄링 함수를 호출하면 생기는 문제점
인터럽트 후반부 기법 종류와 차이점 소개

먼저 인터럽트 후반부 기법을 적용하는 이유를 알아보겠습니다.

인터럽트 후반부 기법을 적용하는 이유

인터럽트 후반부 기법을 적용하는 이유를 알기 위해서 먼저 커널이 인터럽트를 처리하는 방식을 말씀드릴 필요가 있습니다. '인터럽트 후반부'란 용어 자체가 인터럽트를 후반부에 처리한다는 의미를 지니기 때문입니다. 복습 차원에서 5장에서 다룬 인터럽트 처리 과정을 요약해볼까요?
 
1. 인터럽트가 발생하면 커널은 실행 중인 프로세스를 멈추고 인터럽트 벡터를 실행해서 인터럽트 핸들러를 실행합니다.
2. 인터럽트 핸들러는 짧고 빨리 실행해야 합니다.
3. 인터럽트를 처리하는 구간이 인터럽트 컨택스트인데 이를 in_interrupt() 함수가 알려줍니다.

다음 그림은 라즈베리파이에서 인터럽트가 발생했을 때 함수 흐름입니다.

                     
[그림 6.1] 인터럽트가 발생해 프로세스 실행이 멈추는 함수 흐름

위 그림에서 인터럽트가 발생해서 arch_cpu_idle() 함수 실행 도중 __irq_svc 인터럽트 벡터로 실행 흐름이 바뀌었습니다. 

    프로세스 입장에서 보면 arch_cpu_idle() 함수 실행 도중 멈췄습니다.

이렇게 인터럽트가 발생하면 실행 중인 프로세스를 멈추고 인터럽트 벡터로 이동해서 인터럽트 핸들러를 실행합니다. 그래서 인터럽트 핸들러는 빨리 실행해야 합니다.

이 과정에서 임베디드 리눅스 개발자들은 다음과 같은 고민을 하게 됐습니다. 

    인터럽트가 발생한 후 처리해야 할 동작이 많을 때가 있다. 하지만 인터럽트 핸들러는
   빨리 실행해야 한다고 한다. 

답답한 상황입니다. 하지만 고민 끝에 다음과 같은 대안을 내놓게 됐습니다. 

    인터럽트 핸들러에서 급하게 처리하지 않아도 되는 일은 조금 후에 해도 되지 않을까?

여러 고민 끝에 인터럽트가 발생하면 인터럽트를 핸들링할 코드를 2 단계로 나누게 됐습니다.  

빨리 실행할 코드: 인터럽트 핸들러 및 인터럽트 컨택스트
실시간으로 빨리 실행하지 않아도 되는 코드: 인터럽트 후반부 기법

결국 다음과 같은 인터럽트 후반부 처리 기법을 이끌어냈습니다. 

IRQ 스레드
Soft IRQ
태스크릿
워크큐

다음 소절에서는 인터럽트 후반부를 왜 적용해야 하는지 이해를 돕기 위해 인터럽트 컨택스트에서 실행 시간이 오래 걸리는 함수를 호출하면 생기는 문제를 소개합니다. 

Edited: 4/23/2020


     "혹시 글을 읽고 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실하게 답변 올려 드리겠습니다!"


# Reference 인터럽트 후반부 처리








6.9 Soft IRQ 서비스는 누가 언제 처리하나?




6.13 Soft IRQ 디버깅
6.13.1 ftrace Soft IRQ 이벤트 분석 방법
6.13.2 /proc/softirqs로 Soft IRQ 서비스 실행 횟수 확인

# Reference: For more information on 'Linux Kernel';

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

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


    핑백

    덧글

    댓글 입력 영역