IT/Linux Kernel

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 28 - Soft IRQ 서비스 확인

변화의 물결1 2025. 6. 17. 14:20

 

 

안녕하세요.

 

 IRQ 스레드를 끝내고 Soft IRQ에 대해서 확인해 보겠습니다.

 책 내용이 많아서 내용은 요약정도로 정리하고 실습하는 내용으로 조금 빠르게 진행해 보겠습니다.

 


 

1. Soft IRQ 서비스

 

 Soft IRQ 실행한다 의미는 Soft IRQ 서비스를 요청을 받아 이를 처리하는 과정이라고 볼 수 있습니다.

  

1) Soft IRQ 서비스 소개

 

 리눅스 커널에서 10가지 정도의 Soft IRQ 서비스를 지원합니다.

 

 linux# vim kernel/softirq.c

 

 

 

우선순위 Soft IRQ 서비스 설  명
0 HI_SOFTIRQ 가장 우선 순위가 높으며 TASKET_HI로 적용
1 TIMER_SOFTIRQ 동적 타이머 사용
2 NET_TX_SOFTIRQ 네트워크 패킷 송신용으로 사용
3 NET_RX_SOFTIRQ 네트워크 패킷 수신용으로 사용
4 BLOCK_SOFTIRQ 블록 디바이스에서 사용
5 IRQ_POLL_SOFTIRQ IRQ_POLL 연관 동작
6 TASKLET_SOFTIRQ 일반 테스크릿으로 사용
7 SCHED_SOFTIRQ 스케줄러에서 사용
8 HRTIMER_SOFTIRQ 현재 사용하지 않으며 하위 호환성 위해 남겨둠
9 RCU_SOFTIRQ RCU 처리용으로 사용

 

 

2) Soft IRQ 서비스의 라이프 사이클

 

 

1단계 : 부팅 과정

 - 부팅과정에서 open_softirq() 함수를 호출해서 Soft IRQ 서비스를 등록합니다

 

2단계 : 인터럽트 처리

 - 인터럽트 핸들러(인터럽트 컨텍스트)나 인터럽트 핸들러 내에서 호출한 서브 함수에서 raise_softirq() 함수를 호출해 Soft IRQ 서비스를 요청합니다.

 

3단계 : Soft IRQ 컨텍스트

 - __do_softirq() 함수에서 이미 요청한 Soft IRQ 서비스를 실행합니다.

 - 인터럽트 핸들링이 끝나고 Soft IRQ 서비스를 바로 실행하는 동작을 Soft IQR 컨텍스트라 함

 

 

3) 언제 후반부 기법으로 Soft IRQ를 사용하고 왜 알아야 하는가?

 

(1) 언제

 Soft IRQ 기업은 인터럽트 발생 빈도가 높거나  인터럽트 후반부를 빨리 처리해야 할 때 사용합니다. 이유는 인터럽트 핸들러 호출 이후 바로 Soft IRQ 서비스를 실행하기 때문입니다.

 

(2) 왜

 반응 속에 민감한 네트워크 패킷 처리나 고속 그래픽 처리 및 스토리지(UFS: Universal Flash Storage) 드라이버들은 Soft IRQ 서비스를 이용해서 구현되어 있습니다.

 

 인터럽트가 발생하면 실행 중이던 프로세스를 멈추고 인터럽트를 실행합니다. 그런데 Soft IRQ는 인터럽트 핸들러가 수행하면 실행 중이던 프로세스로 돌아가지 않고 바로 Soft IRQ를 시작합니다. 그렇기 때문에 Soft IRQ 쪽에서 시간이 오래 걸리면 시스템 반응 속도가 늦어질 수 있으므로 점검 포인터가 됩니다.

 

 드라이버에서 요청한 동적 타이머들은 타이머 인터럽트가 발생한 다음 Soft IRQ 서비스가 실행되기 때문에 이해하고 있어야 합니다.

 

 커널에서는 Soft IRQ를 디바이스 드라이버 레벨에서 쓸 수 있는 태스크릿이라는 인터페이스 환경을 제공하기 때문에도 이해하고 있어야 합니다.

 

 

2. Soft IRQ 서비스

 

1) Soft IRQ 서비스 란

 

 Soft IRQ 서비스는 Soft IRQ를 실행하는 단위입니다. 위에서 본 내용처럼 Soft IRQ 서비스의 종류를 확인하려면 softirq_to_name 전역변수를 확인하면 됩니다.

 

 Soft IRQ는 Soft IRQ 서비스를 실행하기 위해 존재하며, 커널은 이를 위한 환경을 제공합니다.

 

 

2) Soft IRQ 서비스 핸들러 등록 과정

 

 Soft IRQ 서비스를 등록하려면, 다음 규칙에 따라 open_softirq() 함수를 호출해야 합니다.

 open_softirq(Soft IRQ 서비스의 아이디, Soft IRQ 핸들러)

 

 실제 실제 함수 인자를 보면 형식이 조금 다르게 되어 있지만 내용은 같은 내용입니다.

 

 첫 번째 인자는 정수형 'Soft IRQ 서비스 인덱스'를, 두 번째 인자는 Soft IRQ 서비스 핸들러 함수의 주소를 저장합니다.

 조금 다르게 설명하자면, softirq_vec 배열의 nr 인덱스에 해당하는 원소의 action 필드에 Soft IRQ 서비스 핸들러를 할당한다는 의미입니다.

 

linux# vim kernel/softirq.c

 

 

linux# vim include/linux/interrupt.h

 

action 필드에 Soft IRQ 서비스 핸들러 주소를 저장합니다.

 

 

 

3. 라즈베리 파이에서 Soft IRQ 서비스 핸들러 등록 과정 확인

 

1) 소스 코드 추가

 

 라즈베리 파이에서 open_softirq() 함수가 언제 실행되는지 콜 스택과 함께 확인하기 위해서 dump_stack() 함수 코드 한 줄 추가합니다.

 

저장하고 커널 빌드, 설치한 후 재부팅하고 로그를 확인합니다.

 

linux# vim kernel/softirq.c

 

 

 

2) 커널 로그에서 서비스 과정 확인

 

부팅 시 부분의 로그를 확인합니다.

 

# dmesg

 

처음 부분의 콜 스택 중 init_sched_fair_class() 함수호출을 볼 수 있습니다.

 

 

 init_sched_fair_class()  함수코드를 보면 SCHED_SOFTIRQ라는 Soft IRQ 서비스 아이디로 Soft IRQ 서비스 핸들러 함수인 run_rebalance_domain()을 등록합니다.

 

linux# vim kernel/sched/fair.c

 

 

  

 위와 같이 커널 로그에서 전체 Soft IRQ 서비스가 등록하는 것을 알 수 있으며, 콜 스택과 커널 코드를 확인해 보면 아래와 핸들러 함수와 같이 등록되어 있습니다.

 

Soft IRQ 서비스 아이디 Soft IRQ 서비스 핸들러
HI_SOFTIRQ tasklet_hi_action()
TIMER_SOFTIRQ run_timer_softirq()
NET_TX_SOFTIRQ net_tx_action()
NET_RX_SOFTIRQ net_rx_action()
BLOCK_SOFTIRQ blk_done_softirq()
TASKLET_SOFTIRQ tasklet_softirq()
SCHED_SOFTIRQ run_rebalance_domains()
RCU_SOFTIRQ rcu_process_callbacks()

 

 

 

 

감사합니다.

 

 

 

<참고 자료>

1. [도서] 디버깅을 통해 배우는 리눅스 커널의 구조와 원리 p447~459, wikibook

 

 

 

반응형