x86 Linux에 있는 내용을 보면 /proc/interrupts
일부 인터럽트는 IO-APIC-edge
이고 다른 인터럽트는 입니다 IO-APIC-level
.
인터럽트 유형을 결정하는 요소가 인터럽트 생성 장치인지, 인터럽트 컨트롤러(APIC)인지, Linux 커널인지, 아니면 BIOS인지 알고 싶습니다.
(궁금한 이유는 PCI 카드를 듀얼 프로세서 펜티엄 III 시스템( IO-APIC-level
듀얼 프로세서 제온 시스템으로 인식)에서 듀얼 프로세서 제온 시스템(듀얼 프로세서 제온 시스템 IO-APIC-edge
으로 인식)으로 옮겼기 때문입니다.
답변1
예를 들어82093AAIO-APIC지정할 수 있는 쓰기 가능한 비트가 있는 I/O 리디렉션 테이블 레지스터(IOREDTBL)가 있습니다.트리거 모드(수평 또는 가장자리에 민감할 수 있음) 이러한 레지스터는 struct IO_APIC_route_entry
커널 소스 코드에 반영된 것으로 보입니다 .
2.6.18 커널 소스 코드를 더 자세히 살펴보면 setup_IO_APIC_irqs(..)
발견된 모든 IO-APIC와 각 IO-APIC에 대한 모든 IRQ 라인을 반복하고 io_apic_write(..)
APIC 레지스터에 쓰는 호출을 만드는 함수를 찾을 수 있습니다.
트리거 유형은 함수 MPBIOS_trigger(..)
(호출에 의해 irq_trigger(..)
)에 의해 결정되는 것으로 보이며, 이는 차례로 변수를 참조하는 것으로 보이며 mp_irqs
이 변수는 채워지는 것으로 보입니다 arch/x86_64/kernel/mpparse.c
. 이 파일은 일치하는 MP 구성 테이블을 읽는 것 같습니다.인텔 멀티프로세서 사양.
이 사양에서 인용하면 다음과 같습니다.
The BIOS constructs the MP configuration data structures, presenting the
hardware in a known format to the standard device drivers or to the
hardware abstraction layer of the operating system.
따라서 커널은 BIOS에서 제공한 정보를 기반으로 인터럽트 트리거 유형을 구성한다고 말하고 싶습니다.
참고 사항:중단에 관한 Wikipedia 기사말하는
The original PCI standard mandated shareable level-triggered interrupts.
(이는 충돌하는 동시에 에지 트리거 인터럽트를 보내는 동일한 라인의 여러 장치에서 발생하는 것으로 보입니다.) 이는 PCI 장치에서는 IO-APIC-edge
다소 예상치 못한 일입니다 .
답변2
이것을 결정하는 것은 변수입니다 lpfc_use_msi
. 2로 설정하면 modprobe.conf
IO 대신 MSI를 사용합니다. "MSI 인터럽트 모드"를 사용하는 것이 좋습니다.