Por exemplo, o 82093AA IO-APIC possui registros de tabela de redirecionamento de E / S (IOREDTBL) que tem um
bit gravável especificando o modo de disparo (que pode ser sensível ao nível ou borda). Estes
registros parecem ser refletidos por struct IO_APIC_route_entry
na fonte do kernel.
Cavando um pouco através da fonte do kernel 2.6.18, encontra-se uma função setup_IO_APIC_irqs(..)
que faz um loop sobre todos os IO-APICs encontrados e sobre todas as linhas IRQ para cada IO-APIC e chama io_apic_write(..)
para gravar no APIC registros.
O tipo de trigger parece ser determinado pela função MPBIOS_trigger(..)
(chamada por irq_trigger(..)
) que por sua vez parece consultar uma variável mp_irqs
que por sua vez parece ser preenchida em arch/x86_64/kernel/mpparse.c
. Este ficheiro parece ler a tabela de configuração MP em conformidade com a Especificação Intel MultiProcessor .
Qouting desta especificação:
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.
Então eu diria que o kernel configura o tipo de trigger de interrupção baseado em informações fornecidas pelo BIOS.
Um comentário colateral: o artigo da Wikipédia sobre Interrupções menciona que
The original PCI standard mandated shareable level-triggered interrupts.
(que parece vir do fato de que interrupções acionadas por borda enviadas por vários dispositivos ao mesmo tempo na mesma linha irão colidir). Então IO-APIC-edge
é um pouco inesperado para dispositivos PCI.