Soft IRQ는 인터럽트 후반부 기법으로 쓰이는 방법중 하나다.
Threaded IRQ는 스레드를 하나 만들고 스케줄링되서 처리하는 개념이지만,
Soft IRQ는 인터럽트가 끝나고 나서 바로 처리된다.
1. 서비스 등록
인터럽트 처럼 사전에 서비스를 등록해야 한다.
open_softirq()를 통해 Soft IRQ 서비스 핸들러 함수를 softirq_vec에 등록한다.
2. 인터럽트 처리
인터럽트에서 Soft IRQ 서비스를 요청해야 실행된다.
요청하는 함수는 raise_softirq(id)이다.
raise_softirq는 실행중인 cpu라인의 인터럽트를 비활성화 하고 raise_softirq_irqoff를 실행한다.
raise_softirq_irqoff에선 아래와 같이 irq_stat.__softirq_pending에 1 << id값을 or연산한다
irq_stat.__softirq_pending |= 1 << "soft irq id"
(예를 들면, id가 NET_TX_SOFTIRQ(2)인 경우 irq_stat.__softirq_pending |= 1 << 2 |= 100(2진수) 인 것이다.
3. 인터럽트 후반부 처리
인터럽트 서비스가 끝나면 irq_exit함수를 호출하고 irq_stat.__softirq_pending이 0이 아닌지 확인하는 방식으로 Soft IRQ가 요청되었는지 알아낸다.
Soft IRQ서비스가 요청되었다면 __do_softirq으로 Soft IRQ서비스 핸들러 실행.
__do_softirq 함수에서 Soft IRQ 서비스 요청이 있는지 확인한다.
-> 핸들러를 실행하던 중, 서비스 요청이 들어 올 수 있기 때문.
-> 이렇게 되면 ksoftirqd 스레드를 깨워 서비스를 처리한다.
.. 쓰고 있음
'디버깅을 통해 배우는 리눅스 커널의 구조' 카테고리의 다른 글
ksoftirqd 스레드 (0) | 2022.07.02 |
---|---|
스터디 계획(3주차) (0) | 2022.06.25 |
IRQ 스레드 생성 실습 (0) | 2022.06.21 |
스터디 계획(2주차) (0) | 2022.06.18 |
리눅스 커널 스터디 결산 (1주차) (0) | 2022.06.17 |