Interrupções

PIC, vetores, hooks e notificações de hardware no ciclo de eventos Minix.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

IRQ, vetor e atendimento

  • A IRQ identifica a linha física; o vetor seleciona a rotina na tabela de interrupções. Não são o mesmo número.
  • O PIC clássico tem dois controladores em cascata pela IRQ2. Na sua máscara, bit a 1 bloqueia a linha.
  • IRQs globais usuais: timer 0, teclado 1, COM2 3, COM1 4, RTC 8 e rato 12.
  • O kernel trata a interrupção física, EOI e retorno. O teu timer_ih ou kbc_ih corre no processo quando o ciclo recebe a notificação e o chama.

Num único ciclo de receção, os handlers C são chamados sequencialmente. volatile não substitui sincronização. Um handler recolhe dados; a aplicação interpreta-os. Não esperes pelos restantes bytes de um pacote dentro do primeiro atendimento.

Hook e subscrição

Antes de sys_irqsetpolicy(irq, policy, &hook), guarda o bit pedido. À entrada, hook escolhe esse bit; à saída contém o identificador usado nas kernel calls seguintes.

const unsigned bit = 2;
int hook = bit;
uint32_t mask = 1u << bit; /* 0x04, mesmo para IRQ12 */
  • Escolhe bits distintos que caibam no campo de notificações. Para o bit 7, hook entra com 7 e a máscara é BIT(7), ou 0x80.
  • IRQ_REENABLE autoriza reativação pela rotina genérica; sem essa política, o processo chama sys_irqenable quando estiver pronto.
  • IRQ_EXCLUSIVE impede outro driver de disputar a subscrição, relevante para teclado e rato.
  • Confere erros na configuração e ativação. Se a ativação falhar, remove a política já obtida.

Receção e despacho

  1. driver_receive bloqueia à espera de mensagem.
  2. Confere is_ipc_notify(ipc_status) e origem HARDWARE antes de interpretar m_notify.
  3. Testa todas as máscaras ativas com if independentes.
  4. Processa os eventos e volta à receção.
if (pending & timer_mask) timer_ih();
if (pending & keyboard_mask) keyboard_ih();

Com máscaras 0x01 e 0x08, pending = 0x09 exige ambos os atendimentos. else if perderia o segundo. Define a ordem da aplicação quando tecla e timeout chegam juntos.

Um bit assinala um pedido, não conta interrupções. Pedidos podem ser agrupados enquanto o processo está ocupado. Contar um tick por notificação serve aos pequenos ciclos do laboratório, mas pode perder tempo sob carga.

Ao sair, repõe configurações, desativa e remove subscrições adquiridas, incluindo falhas parciais. Se faltam eventos, verifica dispositivo, ativação, máscara e quem consome o buffer.

Ciclo completo Minix.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.