Cheat sheet
Máscaras, sequências, fórmulas e erros de C e dos periféricos do PC.
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ção | Consulta rápida |
|---|---|
| Byte de um dispositivo | uint8_t; sys_inb recebe armazenamento de 32 bits |
| Complementar só oito bits | (uint8_t)~byte, antes de deslocar |
| Alterar o objeto do chamador | Receber o seu endereço e desreferenciar |
| Alterar o apontador do chamador | Devolver novo apontador ou receber T ** |
| Duração automática | Termina com o bloco; não devolver endereço local |
| Memória dinâmica | Conferir malloc, inicializar, libertar uma vez; não avaliar aliases após free |
| Array recebido por parâmetro | Passar também o comprimento |
| Biblioteca estática | ar rcs libname.a a.o; ligar objetos antes da biblioteca |
| Apontador para função | int (*f)(int), assinatura compatível |
- ABI char 1/1, short 2/2, int 4/4: struct com
char[10],int,shortocupa 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ção | Expressão |
|---|---|
Algum bit de m | (r & m) != 0 |
Todos os bits de m | (r & m) == m |
| Ligar, limpar, inverter | r | m, r & ~m, r ^ m |
| Substituir campo | (r & ~mask) | ((value << shift) & mask) |
Nomear o bit n | BIT(n), ou (1u << (n)) |
| Máscara da notificação | 1u << bit_pedido, não 1u << IRQ |
| Vários bits pendentes | if 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
ifindependentes por dispositivo. -
Limpar recursos também após falha parcial, pela ordem inversa da aquisição.
-
No L3223 fictício,
0x23lê 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
0xF4e depois0x01na porta0x21; a contagem usa a unidade configurada, nãoTIMER_FREQ / intervalo. -
Estado
0x05indica pedidos dos timers 0 e 2; IRQ partilhada exige consultar a causa, não escolher o timer pela notificação.
Timer i8254
- Portas 0, 1, 2:
40,41,42hex. Controlo:43hex. 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.
- , . Conferir divisor antes de converter para 16 bits.
- Estado por read-back do timer 0:
E2hex em controlo, depois ler40hex. COUNT e STATUS ativos a 0. - Extrair modo:
(st >> 1) & 7; normalizar 6 para 2 e 7 para 3. Preservarst & 0x0Fao 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ção | Regra |
|---|---|
| i8042 estado | Ler 64 hex; OBF bit 0, IBF bit 1, AUX bit 5, erros 7:6 |
| Ler dados | OBF a 1, ler 60 hex e descartar se inválido |
| Escrever comando ou argumento | Esperar IBF a 0 antes de cada escrita |
| Set 1 | Esc make 01, break 81; E0 é prefixo, não evento |
| Command byte KBC | Ler com comando 20; escrever com comando 60; valor em porta 60 |
| Rato | IRQ12, três bytes por pacote, uma leitura por notificação |
| Primeiro byte do rato | Bit 3 a 1; não testar esse bit nos restantes bytes |
| Deltas PS/2 | Byte 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 rato | D4 em porta 64, byte em 60, ACK FA |
| Respostas | FE reenvio, FC erro; limitar tentativas |
| Reporting | F4 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.
Vídeo
- VBE
INT 10h: AX4F00controlador,4F01modo,4F02seleção. BX bit 14 pede framebuffer linear. Sucesso VBE: AX004F. - Mapear VRAM física para o espaço virtual; não escrever num cast de
PhysBasePtr. - , offset com e , tamanho de imagem . 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_loadproduz 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.
RTC
- Selecionar registo em
70hex; ler ou escrever dados em71hex. IRQ8. - BCD: , 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.
UART e protocolos
- COM1: base
3F8hex, IRQ4. COM2: base2F8hex, 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 . 8N1: LCR
03hex 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.
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.