Three cases
<aside>
💡 IRQ status
- IRQ_DISABLED = 인터럽트를 허용하지 않은상태(line)
- IRQ_WAITNG = 인터럽트를 기다리는상태(아무 인터럽트도 발생하지 않음)
- IRQ_PENDING = 인터럽트가 발생했지만, 커널로 보내지는 않은 상태(기다리는 중)
- IRQ_INPROGRESS = 커널이 ISR(Interrupt Service Routine)을 실행중인 상태
각각의 상태를 저장하는 형태로 4비트로 이루어져 있다.
</aside>
(CPU(i)가 IRQ(m)의 인터럽트를 처리하려할 때)
- IRQ(m)라인을 어느 CPU도 인터럽트 처리를 하고 있지 않을때
- 다른 CPU가 IRQ(m)라인의 인터럽트 처리를 하고 있을때
- CPU(i)는 인터럽트를 하지 않는다. (IRQ(m)라인을 처리하고 있는 CPU에게 할 일을 넘긴다.)
- CPU(i)는 WAITING 상태에서 PENDING 상태로 바꿔준다.
- CPU(k)가 IRQ(m)라인의 인터럽트를 모두 처리했을때
- IRQ(m)의 인터럽트를 처리하는 CPU(k)는 status가 PENDING인지를 확인하고, PENDING일시(다른 CPU가 PENDING으로 바꿔놨을 시)인터럽트를 한번 더 처리한다.
p.65
- IRQ(m)이 인터럽트를 요청한다.
- APIC은 IRQ(m)이 어느 CPU에 갈지 정한다.
- CPU(i)는 irq_desc[m].status(구조체의 상태)를 PENDING으로 바꾼다.
- PENDING으로 바꾸고, 다른 CPU가 인터럽트를 처리하고 있는지 확인한다.
- 아무도 처리하고 있지 않을때는 자신이 처리한다.
- 다른 CPU가 처리하고 있을때는 어차피 하나의 한라인당 CPU밖에 일을 할 수 없기 때문에 기존에 일을 처리하고 있던 CPU가 처리하도록 만든다.
p.72
p.90
ISR이 디바이스를 처리하는데 너무 많은 시간이 필요할때
ISR과 비트만 세팅해두고 나중에 다시 수행한다. 이 비트를 “soft-irq pending bit”이라고한다.
do_irq()는 하드웨어가 호출하는 irq 함수이고,
do_softirq()는 소프트웨어가 호출하는 irq 함수이다.