리눅스 3.6.0이 설치된 x86 시스템에서 작업하고 있습니다. 일부 실험에서는 IRQ가 벡터에 매핑되는 방식을 알아야합니다. 나는 많은 책에서 벡터 0x0에서 0x20은 트랩과 예외에 대한 것이고 이후 벡터 0x20에서는 외부 장치 인터럽트에 대한 것이라고 말하고있다. 그리고 이것은 또한 소스 코드를 리눅스/아치에 정의/86/포함/ASM/irq_vectors.hdo_IRQ의 인터럽트 벡터 및 irq 매핑
그러나, 제가 의아해 해요 것은 내가 do_IRQ 기능을 검사 할 때, http://lxr.linux.no/linux+v3.6/arch/x86/kernel/irq.c#L181 내가 IRQ가 페치 발견하다 은 "vector_irq"배열 찾는 기준 :의 printk와 코드를 인스트루먼트하여
unsigned int __irq_entry do_IRQ(struct pt_regs *regs)
{
struct pt_regs *old_regs = set_irq_regs(regs);
/* high bit used in ret_from_ code */
unsigned vector = ~regs->orig_ax;
unsigned irq;
...
irq = __this_cpu_read(vector_irq[vector]); // get the IRQ from the vector_irq
// print out the vector_irq
prink("CPU-ID:%d, vector: 0x%x - irq: %d", smp_processor_id(), vector, irq);
}
을, 내가 가진 벡터 IRQ 매핑은 다음과 같으며이 매핑 왜 내가 어떤 단서를 가지고 있지 않습니다. 비록 매핑이 (irq + 0x20 = vector)되어야하지만, 그렇지 않은 것 같습니다.
from: Linux/arch/x86/include/asm/irq_vector.h
* Vectors 0 ... 31 : system traps and exceptions - hardcoded events
* Vectors 32 ... 127 : device interrupts = 0x20 – 0x7F
는하지만 내 출력은 다음과 같습니다
CPU-ID=0.Vector=0x56 (irq=58)
CPU-ID=0.Vector=0x66 (irq=59)
CPU-ID=0.Vector=0x76 (irq=60)
CPU-ID=0.Vector=0x86 (irq=61)
CPU-ID=0.Vector=0x96 (irq=62)
CPU-ID=0.Vector=0xa6 (irq=63)
CPU-ID=0.Vector=0xb6 (irq=64)
은 BTW, 이들의 IRQ는 MSIX가 활성화 내 10 기가 바이트 이더넷 카드입니다. 누구나 이것이 왜 매핑인지에 대한 아이디어를 나에게 줄 수 있습니까? 이 매핑을 만들기위한 규칙은 무엇입니까?
감사합니다. William
설명해 주셔서 감사합니다. irq 번호가 벡터 번호와 같지 않다는 것을 이해합니다. 그러나 irq와 벡터 숫자는 단지 상쇄 된 것이라고 생각했습니다.내가 아는 한, 우선 순위는 I/O APIC 및 로컬 APIC 하드웨어에 의해 중재되며 라우팅 항목은 대상 코어를 결정합니다. 제 질문은 벡터가 특정 IRQ 번호에 어떻게 할당되고 뒤에 어떤 규칙이 있는지입니다. –