CHAPTER 04
4. Linux IRQ에서 CPU별 vector와 IDT entry까지 연결한다
Linux virq가 CPU별 vector matrix에 할당되고 IDT device vector가 assembly entry와 `common_interrupt`를 거쳐 irq_desc를 찾는 과정을 migration state와 함께 봅니다.
vector
8-bit IDT vector는 CPU별 자원이며 Linux virq와 1:1 전역 번호가 아닙니다.
vector matrix
예약 vector와 priority class를 제외하고 CPU affinity에 따라 할당합니다.
IDT
gate type, DPL, IST와 entry 주소가 vector 진입을 결정합니다.
migration
old vector를 즉시 재사용하지 않고 cleanup interrupt 등으로 stale delivery를 처리합니다.
레지스터·번호·소유권 대조
| 항목 | 소유자 | 값의 의미 | 정상 증거 | 오류 해석 |
|---|---|---|---|---|
| irq_cfg vector/domain | Linux x86 IRQ | CPU별 vector와 domain | affinity target에 할당 | vector 없음/old vector |
| IDT gate | CPU | entry address/type | generated entry와 일치 | 잘못된 gate |
| pt_regs vector | entry code | 수신 vector | LAPIC ISR와 동일 | entry decode |
| vector_irq[vector] | per-CPU Linux | irq_desc mapping | 현재 virq 또는 cleanup state | stale mapping |
| irq_desc/action | Linux IRQ core | flow handler와 driver | 요청 action 존재 | dispatch 이후 경계 |
실패 경계 판정
| 증상 | 직전 통과 | 우선 확인 | 반증 시험 | 판정 |
|---|---|---|---|---|
| LAPIC ISR set, common entry 없음 | vector active | IDT gate/IF/entry | IDT dump와 trace | CPU entry |
| entry vector는 맞고 wrong virq | common_interrupt 실행 | per-CPU vector_irq | CPU별 mapping dump | vector mapping |
| affinity 이동 중 spurious | 평상시 정상 | old vector cleanup | migration trace와 ISR | stale delivery |
| vector allocation 실패 | virq 생성 | vector matrix/affinity mask | CPU mask 확대 | 자원 고갈 |
| handler latency CPU별 차이 | entry 모두 실행 | vector priority/irqoff section | CPU별 irqsoff trace | local scheduling |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | virq→CPU→vector→IDT entry를 표로 저장합니다. | 번호 ledger | mapping 확인 |
| 2 | LAPIC ISR vector와 pt_regs vector를 비교합니다. | 동일 vector | entry 검증 |
| 3 | affinity migration trace에서 old/new vector 수명을 봅니다. | cleanup 완료 | stale 처리 |
| 4 | CPU hotplug와 vector 압박 조건을 반복합니다. | allocation/이동 성공 | 경계조건 검증 |
주의`/proc/interrupts` 번호는 IDT vector가 아닙니다. vector는 CPU별로 다를 수 있습니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 vendor register나 integration별 offset을 추측해서 채우지 않았습니다. 아래 제조사 자료, architecture 문서와 Linux v6.18.37 원본에서 다시 확인할 수 있는 범위만 사용했습니다.
Intel 64 and IA-32 SDM
Local APIC, x2APIC, interrupt/exception과 virtualization
Linux APIC code
APIC mode 선택과 초기화
Linux IOAPIC code
GSI와 redirection entry 관리
Linux vector allocator
CPU별 vector 할당과 이동