fbpx

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 🙂

Tratamento de IRQs no Linux
Classificado como:            

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.