Cheat sheet

Máscaras, sequências, fórmulas e erros de C e dos periféricos do PC.

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Esta folha reúne condições e sequências para consultar depois das lições. Os links levam às contas e aos exemplos completos.

C e memória

Operação ou condiçãoConsulta rápida
Byte de um dispositivouint8_t; sys_inb recebe armazenamento de 32 bits
Complementar só oito bits(uint8_t)~byte, antes de deslocar
Alterar o objeto do chamadorReceber o seu endereço e desreferenciar
Alterar o apontador do chamadorDevolver novo apontador ou receber T **
Duração automáticaTermina com o bloco; não devolver endereço local
Memória dinâmicaConferir malloc, inicializar, libertar uma vez; não avaliar aliases após free
Array recebido por parâmetroPassar também o comprimento
Biblioteca estáticaar rcs libname.a a.o; ligar objetos antes da biblioteca
Apontador para funçãoint (*f)(int), assinatura compatível
  • ABI char 1/1, short 2/2, int 4/4: struct com char[10], int, short ocupa 20 bytes, com campos em 0, 12 e 16; union ocupa 12, e três unions ocupam 36. As contas dependem da ABI, não apenas da largura dos endereços. Layout explicado.

Tipos e compilação, memória e funções.

Registos e interrupções

IntençãoExpressão
Algum bit de m(r & m) != 0
Todos os bits de m(r & m) == m
Ligar, limpar, inverterr | m, r & ~m, r ^ m
Substituir campo(r & ~mask) | ((value << shift) & mask)
Nomear o bit nBIT(n), ou (1u << (n))
Máscara da notificação1u << bit_pedido, não 1u << IRQ
Vários bits pendentesif independentes, sem else if
  • Portas de timer, i8042 e UART pertencem ao espaço de I/O; framebuffer é memória mapeada.

  • No PIC, máscara a 1 bloqueia IRQ; na notificação Minix, bit a 1 indica pedido.

  • Guardar o bit pedido antes de sys_irqsetpolicy; usar o hook devolvido nas restantes kernel calls.

  • Receber, conferir notificação, origem HARDWARE e máscara, com if independentes por dispositivo.

  • Limpar recursos também após falha parcial, pela ordem inversa da aquisição.

  • No L3223 fictício, 0x23 lê estado e escreve controlo; reservados ficam zero.

  • Timer 1, alarme e milissegundos dão 0x51, sem preservar o estado lido por OR.

  • 500 ms escrevem 0xF4 e depois 0x01 na porta 0x21; a contagem usa a unidade configurada, não TIMER_FREQ / intervalo.

  • Estado 0x05 indica pedidos dos timers 0 e 2; IRQ partilhada exige consultar a causa, não escolher o timer pela notificação.

Contrato e sequência.

Registos, hooks.

Timer i8254

  • Portas 0, 1, 2: 40, 41, 42 hex. Controlo: 43 hex. Timer 0 usa IRQ0.
  • Palavra normal: seleção nos bits 7:6, acesso em 5:4, modo em 3:1 e BCD em 0.
  • LSB/MSB: acesso 11. Escrever LSB e depois MSB na mesma porta do contador.
  • Modo 2 dá impulso periódico; modo 3 dá onda aproximadamente quadrada. Divisor mínimo 2 nesses modos; binário zero codifica 65536.
  • f=fin/Nf=f_{in}/N, t=k/ft=k/f. Conferir divisor antes de converter para 16 bits.
  • Estado por read-back do timer 0: E2 hex em controlo, depois ler 40 hex. COUNT e STATUS ativos a 0.
  • Extrair modo: (st >> 1) & 7; normalizar 6 para 2 e 7 para 3. Preservar st & 0x0F ao mudar só acesso e frequência.
  • Subtração sem sinal mede intervalos através de uma passagem por zero, se o intervalo tiver menos de uma volta completa.

Configuração, divisor, intervalos.

Teclado e rato

Campo ou operaçãoRegra
i8042 estadoLer 64 hex; OBF bit 0, IBF bit 1, AUX bit 5, erros 7:6
Ler dadosOBF a 1, ler 60 hex e descartar se inválido
Escrever comando ou argumentoEsperar IBF a 0 antes de cada escrita
Set 1Esc make 01, break 81; E0 é prefixo, não evento
Command byte KBCLer com comando 20; escrever com comando 60; valor em porta 60
RatoIRQ12, três bytes por pacote, uma leitura por notificação
Primeiro byte do ratoBit 3 a 1; não testar esse bit nos restantes bytes
Deltas PS/2Byte baixo menos 256 se o sinal do primeiro byte for 1
Coordenadas de ecrãx += dx, y -= dy; validar com sinal e limitar
Comando de ratoD4 em porta 64, byte em 60, ACK FA
RespostasFE reenvio, FC erro; limitar tentativas
ReportingF4 ativa, F5 desativa; não misturar respostas e pacotes
  • Chegada de um byte: teclado envia, KBC guarda com OBF a 1, IRQ1 se ativa, programa lê estado e dados.

Teclado, pacotes, comandos.

Vídeo

  • VBE INT 10h: AX 4F00 controlador, 4F01 modo, 4F02 seleção. BX bit 14 pede framebuffer linear. Sucesso VBE: AX 004F.
  • Mapear VRAM física para o espaço virtual; não escrever num cast de PhysBasePtr.
  • B=⌈bpp/8⌉B=\lceil bpp/8\rceil, offset =y⋅pitch+x⋅B=y\cdot pitch+x\cdot B com 0≤x<width0\leq x<width e 0≤y<height0\leq y<height, tamanho de imagem =pitch⋅height=pitch\cdot height. Em 24 bpp, escreve exatamente três bytes por píxel e valida as multiplicações antes de endereçar.
  • Indexed guarda índice da paleta. Direct color usa tamanhos e posições dos campos do modo.
  • 24 bpp ocupa três bytes; escrever quatro pisa o píxel seguinte.
  • XPM é texto; xpm_load produz pixmap. Carregar uma vez, validar falha e definir propriedade.
  • Double buffering por cópia reduz desenho intermédio; sincronização vertical continua necessária para evitar tearing. Page flipping muda a imagem apresentada na VRAM.

Endereços, cores, buffers.

RTC

  • Selecionar registo em 70 hex; ler ou escrever dados em 71 hex. IRQ8.
  • BCD: 10(v≫4)+(v&15)10(v\gg4)+(v\mathbin{\&}15), só com algarismos válidos. B.DM a 1 significa binário.
  • B bit 1 a 1 significa 24 h. Em 12 h, separar PM antes de converter.
  • A.UIP indica atualização. Garantir leitura coerente, não apenas converter bytes.
  • B bits PIE/AIE/UIE 6/5/4; C bits PF/AF/UF 6/5/4. Ler C limpa flags, testar causas independentemente.
  • Alarme com dois bits superiores a 1 num campo aceita qualquer valor desse campo.

Formatos, coerência.

UART e protocolos

  • COM1: base 3F8 hex, IRQ4. COM2: base 2F8 hex, IRQ3.
  • Offsets 0 dados, 1 IER, 2 IIR/FCR, 3 LCR, 5 LSR.
  • LCR.DLAB a 1 transforma offsets 0 e 1 em DLL/DLM. Limpar antes de dados ou IER.
  • Taxa clássica =115200/D=115200/D. 8N1: LCR 03 hex e dez bits por byte útil.
  • LSR bit 0 dado disponível, bit 5 THR vazio, bit 6 transmissão toda terminada.
  • IIR bit 0 a 1 significa nenhuma causa pendente. Ler e tratar todas as causas relevantes.
  • FIFO não substitui fila de software. Definir capacidade e política de perda.
  • Mensagens precisam de framing, comprimento, tipos e integridade. Delimitadores nos dados exigem escaping.
  • Reenvio após timeout precisa de sequência e tratamento de duplicados para não repetir efeitos.

UART, mensagens, duplicados.

Aplicação e diagnóstico

  • Driver recolhe dados; parser produz eventos; aplicação muda estado; desenho apresenta um frame.
  • Processar todos os eventos antes de voltar a bloquear; definir ordem para eventos simultâneos.
  • Recursos adquiridos pedem limpeza inversa; modo de vídeo só se repõe se foi alterado.
  • Para depurar: escolher uma entrada mínima, prever o resultado e testar uma hipótese de cada vez.

Máquinas de estados, debugging.

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