안녕하세요.
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
'IT > Linux Kernel' 카테고리의 다른 글
디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 30 - Soft IRQ 처리 시점 확인 (2) | 2025.06.24 |
---|---|
디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 29 - Soft IRQ 요청 시점 확인 (3) | 2025.06.19 |
디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 27 - IRQ 스레드 디버깅 실습 (11) | 2025.06.13 |
디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 26 - IRQ 스레드 생성 설명 (10) | 2025.06.10 |
디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 25 - 인터럽트 후반부 처리와 IRQ 스레드(Threaded IRQ) 설명 (11) | 2025.06.06 |