2013-09-24 3 views
4

리눅스 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

답변

2

irq 번호 (소프트웨어에서 사용하는 것)는 벡터 번호 (인터럽트 컨트롤러가 실제로 사용하는 번호)와 동일하지 않습니다.

벡터 번호가 서로 와 충돌하지 않도록 이격되어 그래서/OAPIC 인터럽트 컨트롤러는 16 개의 그룹으로 인터럽트 우선 순위를 할당 86 (함수 arch/x86/kernel/apic/io_apic.c__assign_irq_vector 참조).

+0

설명해 주셔서 감사합니다. irq 번호가 벡터 번호와 같지 않다는 것을 이해합니다. 그러나 irq와 벡터 숫자는 단지 상쇄 된 것이라고 생각했습니다.내가 아는 한, 우선 순위는 I/O APIC 및 로컬 APIC 하드웨어에 의해 중재되며 라우팅 항목은 대상 코어를 결정합니다. 제 질문은 벡터가 특정 IRQ 번호에 어떻게 할당되고 뒤에 어떤 규칙이 있는지입니다. –

2

내 질문에 벡터가 특정 코드에 할당되는 방법입니다. IRQ 번호 및 그 뒤에있는 규칙은 무엇입니까?

IOAPIC은 각 IRQ 입력에 대해 IOREDTBL이라는 레지스터를 지원합니다. 소프트웨어는이 레지스터의 비트 7-0을 사용하여 IRQ 입력에 대해 원하는 벡터 번호를 할당합니다. 이 벡터 번호는 프로세서 인터럽트 설명자 표의 색인 역할을합니다. 0 인터럽트 벡터 (INTVEC) -R/W : 벡터 필드는이 인터럽트에 대한 인터럽트 벡터를 포함하는 8 비트 필드이다 IOAPIC 매뉴얼 (82093AA)

7 인용. 벡터 값 범위는 10h에서 FEh까지입니다.

이 레지스터는 소프트웨어에서 직접 액세스 할 수있는 이 아니며,이 아닙니다. 로컬 APIC 레지스터와 혼동하지 않도록 IOAPIC 레지스터에 액세스하려면 소프트웨어가 IOREGSEL 및 IOWIN 레지스터를 사용하여 IOAPIC과 간접적으로 상호 작용해야합니다. 이 레지스터는 IOAPIC 매뉴얼에도 설명되어 있습니다.

IOAPIC에 대한 출처 정보는 조금 파 좋을 수 있습니다. 다음은 내가 사용한 예에 대한 링크입니다. IOAPIC data sheet link

+1

답장을 보내 주셔서 감사합니다. 필자는 현재 대부분의 장치가 IRQ가 IOAPIC 하드웨어의 PIN에 연결되지 않는 레거시 IRQ 인터럽트 대신 MSI-X를 사용함을 발견했습니다. 나는 계속해서 60을 넘는 IRQ를 얻었는데, 실제 하드웨어 핀이 아닌 것 같다. 이 경우 IOAPIC 및 해당 리디렉션 테이블이 MSI 기반 인터럽트를 리디렉션하는 데 여전히 작동합니까? 또는 MSIX는 CPU 코어로 직접 이동합니까? –

+1

MSI-X를 사용하면 PCI-E 장치가 IRQ 입력 당 실제 물리적 와이어없이 특정 IRQ를 어설 션 할 수 있습니다. 그러나 IRQ 번호와 벡터 번호의 매핑은 설명 된 것과 같습니다. – srking