Tratamento de IRQs no Linux
As Requisições de Interrupção (IRQ) são chamadas que os dispositivos podem fazer para requerer atenção especial do processador.
A maioria dos computadores oferece apenas 16 interrupções de hardware. Pode parecer pouco para as modernas configurações com os mais diferentes dispositivos. Felizmente os IRQs podem ser compartilhados.
O mecanismo de tratamento das interrupções faz com que a CPU esteja atenta aos eventos externos à sequência de instruções que ela está executando, para quando for necessária uma quebra do processamento normal para atender a uma outra solicitação.
Em grandes sistemas multiusuário, uma constante rajada de interrupções é direcionada ao processador.
Respostas rápidas a essas interrupções são essenciais para manter os recursos do sistema bem utilizados, e para prover tempos de resposta aceitáveis pelos usuários.
É importante saber que estes recursos são limitados e precisam ser gerenciados para que conflitos entre os dispositivos sejam evitados.
Desta forma, os sistemas operacionais reagem a eventos que representam as solicitações de serviços.
Por exemplo, se uma aplicação necessita da leitura de um arquivo, ela faz a solicitação a uma função executada pelo sistema operacional.
Este irá acessar o controlador do periférico e requisitar a transferência dos dados para o endereço de memória informado no pedido do serviço.
O controlador do periférico ao terminar avisa o processador através de uma requisição de interrupção que fará com que o sistema operacional execute uma rotina para seu tratamento.
As interrupções podem ser geradas pelos seguintes eventos:
- Geradas por programa que são implementadas com o uso de instruções especiais;
- Por erro, como na divisão por zero, referência à memória fora do espaço permitido etc;
- Por tempo, como no escalonamento;
- Falha de hardware;
- Por eventos de entrada e saída de dados sinalizando o final de operação ou condição de erro.
- Então, os eventos gerados pelas interrupções provocam a execução da rotina de tratamento correspondente à fonte da interrupção no sistema operacional.
Ao fazer o tratamento das interrupções de hardware, o dispositivo solicitante interrompe processador.
Este acaba a execução da instrução atual, testa existência de interrupção e salva o estado atual do processo que perderá o controle do processador na memória.
O processador carrega o contador de programa com endereço da rotina de tratamento da interrupção e transfere seu controle para a rotina de tratamento da interrupção.
A rotina de tratamento da interrupção executa e, ao término, restaura o estado anterior para retornar à execução da rotina interrompida.
Um núcleo simples desabilita o tratamento de interrupções enquanto ele responde a uma interrupção. Elas são novamente habilitadas após o processamento estar completo.
Se houver um fluxo permanente de interrupções, como nos sistemas multiusuário, este esquema pode ocasionar interrupções desabilitadas por um grande tempo e em respostas insatisfatórias.
Para evitar isso, o Kernel precisa estar atento ao tempo máximo de processamento permitido para cada interrupção. Se essa fatia de tempo estourar, ele passa o restante do processamento da interrupção para um outro processo apropriado do sistema que irá terminar de tratá-las, enquanto o núcleo continua apto a receber novas interrupções.
Isto significa que elas podem ficar habilitadas durante muito tempo, e o sistema torna-se mais eficiente em responder a requisições das aplicações dos usuários.
A lista de IRQs do sistema pode ser vista no arquivo
# cat /proc/interrupts
CPU0
0: 78 IO-APIC 2-edge timer
1: 9 xen-pirq 1-ioapic-edge i8042
4: 3409 xen-pirq 4-ioapic-edge
8: 2 xen-pirq 8-ioapic-edge rtc0
9: 0 xen-pirq 9-ioapic-level acpi
12: 3 xen-pirq 12-ioapic-edge i8042
14: 0 IO-APIC 14-edge ata_piix
15: 0 IO-APIC 15-edge ata_piix
48: 14474493 xen-percpu-virq timer0
49: 0 xen-percpu-ipi resched0
50: 0 xen-percpu-ipi callfunc0
51: 0 xen-percpu-virq debug0
52: 0 xen-percpu-ipi callfuncsingle0
53: 0 xen-percpu-ipi spinlock0
54: 211 xen-dyn-event xenbus
55: 755401 xen-dyn-event blkif
56: 887240 xen-dyn-event eth0
NMI: 0 Non-maskable interrupts
LOC: 0 Local timer interrupts
SPU: 0 Spurious interrupts
PMI: 0 Performance monitoring interrupts
IWI: 0 IRQ work interrupts
RTR: 0 APIC ICR read retries
RES: 0 Rescheduling interrupts
CAL: 0 Function call interrupts
TLB: 0 TLB shootdowns
TRM: 0 Thermal event interrupts
THR: 0 Threshold APIC interrupts
DFR: 0 Deferred Error APIC interrupts
MCE: 0 Machine check exceptions
MCP: 1216 Machine check polls
HYP: 16105716 Hypervisor callback interrupts
ERR: 0
MIS: 0
PIN: 0 Posted-interrupt notification event
PIW: 0 Posted-interrupt wakeup event
Quer aprender mais sobre Linux ? Conheça nosso curso para prova LPI
Aprenda muito mais sobre Linux em nosso curso online. Você pode fazer a matrícula aqui com trial de 7 dias grátis. Se você já tem uma conta, pode acessar aqui.
Gostou? Compartilhe 🙂
Tag:/proc/interrupts, interrupts, IRQs, Linux