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 ํจ์์ด๋ค.