# Advanced Programmable Interrupt Controller

Em computação, Advanced Programmable Interrupt Controller (APIC), em em português: Controlador Avançado de Interrupção Programável, da Intel, é uma família de controladores de interrupções. Como o próprio nome sugere, o APIC é mais avançado do que o Programmable Interrupt Controller (PIC) 8259 da Intel, mais intricado, contendo uma escala muito maior de saídas, esquemas de prioridade muito mais complexos e um gerenciamento avançado de IRQs, permitindo a construção de sistemas com múltiplos processadores. Este é um dos vários projetos arquitetônicos destinados a resolver problemas de eficiência de roteamento de interrupções em sistemas de computadores com múltiplos processadores.
Uma das arquiteturas APIC mais conhecidos, a Intel APIC Architecture, tem substituído a PIC 8259A original nos novos PCs x86. O APIC é um projeto de arquitetura de divisão, com um componente local (LAPIC) normalmente integrado no próprio processador e um APIC de E/S opcional em um barramento do sistema. O primeiro foi o APIC 82489DX - era um chip discreto que funcionava tanto como um APIC local e de E/S. O 82489DX permitiu a construção de sistemas com multiprocessador simétrico (SMP) nos processadores Intel 486 e nos primeiros processadores Pentium; por exemplo, o sistema 486 SMP 2-way utiliza três 82489DX chips, dois como APICs locais e um como APIC de E/S. Começando com o processador P54C, a funcionalidade do APIC local foi integrado aos processadores de silício da Intel. O primeiro APIC de E/S dedicado foi o Intel 82093AA, que foi destinado para sistemas baseados em PIIX3.

## Visão Geral

Existem dois componentes no sistema Intel APIC, o APIC local (LAPIC) e o APIC de E/S. Existe um LAPIC em cada CPU no sistema. Na primeira implementação, o LAPIC era um circuito discreto, o 82489DX, mas depois disso ele foi integrado em processadores Intel. Há tipicamente um APIC de E/S para cada barramento periférico no sistema. Em projetos de sistema originais, LAPICs e APICs de E/S estavam ligados por um barramento APIC dedicado. Sistemas mais recentes usam o barramento do sistema de comunicação entre todos os componentes APIC.
Cada APIC, seja um chip discreto ou integrado em uma CPU, tem um registo de versão que contém um número de versão de quatro bits para a sua implementação de APIC específico. Por exemplo, o 82489DX tem um número de versão APIC de 0, enquanto que a versão 1 foi atribuído à primeira geração de APICs locais integrados nos processadores Pentium 90 e 100.
Em sistemas que contêm um PIC 8259, este pode ser ligado em um LAPIC do Sistema de Processador de Inicialização (BSP), ou a um dos APICs de E/S do sistema, ou ambos. No entanto, logicamente, o 8259 - só é ligado quando em um determinado momento.

## APIC Discreto

A primeira geração de chip APIC da Intel, o 82489DX, que estava destinado a ser utilizado com o Intel 80486 e nos primeiros processadores Pentium, é, na verdade, um APIC local e um APIC de E/S em um circuito. A especificação Intel MP 1.4 refere-se a ele como "APIC discreto", em contraste com o "APIC integrado" encontrado na maioria dos processadores Pentium. O 82489DX tinha 16 linhas de interrupção; também teve um equívoco que poderia perder algumas interrupções de ISA.
Em um sistema multiprocessador 486, cada CPU tinha que ser emparelhado com o seu próprio 82489DX; adicionalmente um 82489DX complementar teve de ser utilizado como APIC de E/S. O 82489DX não poderia emular o 8259A (XT-PIC) então estes também tiveram que ser incluídos como chips físicos para compatibilidade com versões anteriores. O 82489DX foi empacotado como um PQFP de 132-pin.

## APICs locais integradas

APICs locais (LAPICs) gerenciam todas as interrupções externas para algum processador específico em um sistema SMP. Além disso, eles são capazes de aceitar e gerar interrupções inter-processos (IPIs) entre LAPICs. LAPICs pode suportar até 224 vetores de interrupção utilizáveis a partir de um APIC de E/S. Os números de vetores de 0 a 31 são reservados para o tratamento de exceção nos processadores de arquitetura x86.
Todos os processadores Intel começando com a P54C tem um APIC local embutido. No entanto, se o APIC local é desativado em um processador de P5, não pode ser reativado por software; essa limitação não existe mais nos processadores P6 e posteriores. Em sistemas com um único processador, a grande vantagem da APIC local é que as placas PCI não precisam ter suas interrupções mapeadas para as interrupções ISA, mas pode usar PCI virtuais IRQs acima de 15, resultando em menos conflitos e melhor desempenho.
Na família Microsoft de sistema operacional, o Windows XP foi o primeiro a fazer corretamente o uso de IRQ virtuais fornecidos pela APIC local, com algum apoio parcial presente no Windows 2000. No Windows 2000, a propagação de interrupções PCI para cartões virtuais IRQ só acontece se a máquina também tem um APIC de E/S. Microsoft culpou sua implementação do Windows 2000, sobre as informações que tinha recebido da Intel supostamente prometendo que todos os futuros sistemas conteria um APIC de E/S, algo que, em retrospecto, não aconteceu. (Um documento da Microsoft daquela época chegou a afirmar que "sem um APIC de E/S no sistema, os APICs locais são inúteis. Em tal situação, o Windows 2000 tem que voltar a usar a 8259 PIC.") O uso generalizado repentino do APIC local com Windows XP fez expor um número de erros em várias implementações do BIOS. A Microsoft foi forçada a manter o comportamento de empilhamento do PCI IRQ para qualquer máquina com um controlador CardBus (e sem um APIC de E/S).
O recurso Mensagem de Interrupção Sinalizado (MSI) do PCI 2.2 e especificações posteriores não pode ser usado sem o APIC local sendo habilitado. O uso de MSI elimina a necessidade de um APIC de E/S. Além disso, até 224 interrupções são suportados em modo MSI e compartilhamento de IRQ não é permitido.

### APIC temporizador

Outra vantagem do APIC local é que ele proporciona também um cronômetro de alta resolução (da ordem de um microssegundo, ou melhor) que pode ser usado em ambos intervalo e modo pontual.
O cronômetro APIC teve seus problemas de aceitação iniciais. Um documento da Microsoft de 2002 (que ao invés defendeu a adoção de cronômetro de evento de alta precisão) criticou o temporizador LAPIC por ter "baixa resolução" e afirmando que "o silício do relógio às vezes tem muitos erros ". No entanto, o cronômetro APIC é usado, por exemplo, no Windows 7 quando perfil é ativado, e por Windows 8 em todas as circunstâncias. (Antes do Windows 8 foi reivindicado direitos exclusivos para este temporizador, também foi usado por alguns programas como o CPU-Z.) No Microsoft Windows o temporizador APIC não é um recurso compartilhável.
As interrupções aperiódicas oferecidos pelo temporizador APIC são usados pelo kernel do Linux a partir de 2.6.18 em diante para implementar o seu recurso tickless kernel; o legado 8253 Temporizador De Intervalo Programável não é mais usado pelos tickless kernels. Um documento VMware observa que "software não tem uma maneira confiável para determinar a sua frequência. Geralmente, a única maneira de determinar a frequência do temporizador APIC local é medir -lo usando o PIT ou CMOS timer, que produz unicamente um resultado aproximado. "

## APICs de E/S

APICs de E/S contém uma tabela de redirecionamento, que é usado para rotear as interrupções que recebe de barramento periférico para um ou mais APICs locais. A primeira geração de APIC de E/S dedicado, o 82093AA, tinha suporte para 24 linhas de interrupção. Ele foi empacotado como um 64-Pin PQFP. A 82093AA normalmente conectado à PIIX3 e usou seu legado integrado 8259 PICs.
De acordo com um Intel 2009 de referência utilizando o Linux, o APIC de E/S reduziu a interrupção de latência por um fator de quase três, relativo ao emulador 8259 (XT-PIC), enquanto utilizando o MSI reduz a latência ainda mais, por um fator de cerca de sete relativo a linha de base XT-PIC.

## Variantes

O xAPIC foi introduzido com o Pentium 4, enquanto o x2APIC é a mais recente geração de controlador de interrupção programável da Intel, introduzidos com a microarquitetura Nehalem. As principais melhorias do x2APIC endereça o número de CPUs suportadas e o desempenho da interface.
APICv é a marca da Intel para suporte à virtualização de hardware visando reduzir sobrecarga interrupção em seus hóspedes. APICv foi introduzido nos processadores Ivy Bridge-EP. A AMD anunciou uma tecnologia similar chamada AVIC, mas ainda tem que enviar os produtos com ela.

## Problemas

Há um número de problemas conhecidos em implementações de sistemas APIC, sobretudo com a preocupação de como o 8254 é conectado. BIOS defeituosos pode não configurar o roteamento de interrupção corretamente, ou fornecer tabelas ACPI incorretas e tabelas de Especificações de Multiprocessadores (MPS) da Intel.
O APIC também pode ser uma causa de falha do sistema quando o sistema operacional não o suporta adequadamente. Em sistemas operacionais mais antigos, os APICs local e de E/S, muitas vezes teve de ser desativado. Embora isso não seja mais possível devido à prevalência de multiprocessadores simétricos e sistemas multi-core, os erros no firmware e nos sistemas operacionais agora são uma ocorrência rara.

## Competição

A AMD e Cyrix uma vez propuseram como algo semelhante a arquitetura OpenPIC que suporta até 32 processadores; que tinha pelo menos apoio declarativo da IBM e Compaq por volta de 1995. Entretanto, a placa-mãe do x86 foi lançado com OpenPIC. Após o fracasso do OpenPIC no mercado x86, a AMD licenciou o APIC da Intel para a sua AMD Athlon e processadores posteriores.
A IBM no entanto desenvolveram seu Controlador de Interrupção de Multiprocessador (MPIC) com base nas especificações de registo OpenPIC. MPIC foi utilizado em projetos baseados no PowerPC, incluindo os da IBM, por exemplo, em alguns sistemas RS/6000, mas também pela Apple, tão tarde quanto os seus Power Mac G5.