Three cases


<aside> 💡 IRQ status

  1. IRQ_DISABLED = 인터럽트를 허용하지 않은상태(line)
  2. IRQ_WAITNG = 인터럽트를 기다리는상태(아무 인터럽트도 발생하지 않음)
  3. IRQ_PENDING = 인터럽트가 발생했지만, 커널로 보내지는 않은 상태(기다리는 중)
  4. IRQ_INPROGRESS = 커널이 ISR(Interrupt Service Routine)을 실행중인 상태

각각의 상태를 저장하는 형태로 4비트로 이루어져 있다.

</aside>

(CPU(i)가 IRQ(m)의 인터럽트를 처리하려할 때)

  1. IRQ(m)라인을 어느 CPU도 인터럽트 처리를 하고 있지 않을때
  2. 다른 CPU가 IRQ(m)라인의 인터럽트 처리를 하고 있을때
  3. CPU(k)가 IRQ(m)라인의 인터럽트를 모두 처리했을때

p.65

  1. IRQ(m)이 인터럽트를 요청한다.
  2. APIC은 IRQ(m)이 어느 CPU에 갈지 정한다.
  3. CPU(i)는 irq_desc[m].status(구조체의 상태)를 PENDING으로 바꾼다.
  4. PENDING으로 바꾸고, 다른 CPU가 인터럽트를 처리하고 있는지 확인한다.
    1. 아무도 처리하고 있지 않을때는 자신이 처리한다.
    2. 다른 CPU가 처리하고 있을때는 어차피 하나의 한라인당 CPU밖에 일을 할 수 없기 때문에 기존에 일을 처리하고 있던 CPU가 처리하도록 만든다.

p.72

p.90

ISR이 디바이스를 처리하는데 너무 많은 시간이 필요할때

ISR과 비트만 세팅해두고 나중에 다시 수행한다. 이 비트를 “soft-irq pending bit”이라고한다.

do_irq()는 하드웨어가 호출하는 irq 함수이고,

do_softirq()는 소프트웨어가 호출하는 irq 함수이다.