Falar com o hardware

Portas de entrada e saída, memória mapeada, máscaras e polling com limites.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Registos e acesso

Registos de dados, estado e controlo podem partilhar endereço, com funções diferentes na leitura e na escrita. Um acesso pode alterar o dispositivo.

AcessoEndereçosOperações
Port-mapped I/OEspaço de portas separadoIN/OUT em x86, através de kernel calls Minix
Memory-mapped I/OEspaço de memóriaAcesso à região virtual mapeada, como o framebuffer

No i8042, ler 0x64 consulta estado e escrever envia um comando. Ler 0x60 retira dados do output buffer; escrever envia um byte pelo input buffer. Input/output referem-se ao controlador.

sys_inb escreve num objeto de 32 bits, mesmo para uma leitura de byte. Passa &raw de um uint32_t e converte depois para uint8_t; fazer cast ao endereço de um uint8_t não cria esse espaço. Adaptação segura.

Máscaras e campos

Operação sobre registo r e máscara mExpressão
Algum bit ativo(r & m) != 0
Todos ativos(r & m) == m
Ligar, limpar ou inverterr | m, r & ~m, r ^ m
Nomear o bit nBIT(n), ou (1u << (n))

BIT(7) vale 0x80: é a máscara, não a posição. Onde a API pede o número do bit, como em hook, passa-se 7.

& opera bit a bit; && devolve a verdade lógica. Para substituir o campo 4:2 por 5, limpa 0x1C antes de inserir: (r & ~0x1C) | (5 << 2). Com r = 0xA7, obténs 0xB7. Só OR deixaria bits antigos ligados. Passos e exemplo.

Construir pela especificação

  • No dispositivo fictício L3223 do PP1 de 2020, ler 0x23 devolve estado e escrever configura. Não preserves esse estado como se fosse a configuração anterior.
  • Timer 2, alarme e milissegundos dão controlo 0x91, com bits reservados zero. Contagem 1000 escreve 0xE8 e depois 0x03 na mesma porta 0x22. A unidade é parte da configuração; a contagem não é um divisor do relógio i8254. O plano C da lição não executa hardware.

Polling e limites

  • Antes de ler dados do i8042, espera OBF = 1; antes de escrever, espera IBF = 0.
  • Se OBF estiver ativo e houver erro de paridade/timeout, consome o byte de 0x60 e descarta-o. Deixá-lo no buffer pode bloquear novas entregas.
  • Define limite de tentativas, atraso e resultado de falha. Cinco observações separadas por 20 ms têm quatro atrasos, cerca de 80 ms, além das chamadas e arredondamento a ticks.
  • Com consultas a cada período PP, um evento que permanece disponível espera aproximadamente entre 0 e PP. Se a chegada for uniforme, a média é P/2P/2.
  • Polling serve uma resposta curta esperada; interrupções permitem bloquear à espera de eventos. Decide pela carga, latência admissível e capacidade do buffer.

Polling com timeout.

À 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.