Falar com o hardware
Portas de entrada e saída, memória mapeada, máscaras e polling com limites.
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.
| Acesso | Endereços | Operações |
|---|---|---|
| Port-mapped I/O | Espaço de portas separado | IN/OUT em x86, através de kernel calls Minix |
| Memory-mapped I/O | Espaço de memória | Acesso à 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 m | Expressão |
|---|---|
| Algum bit ativo | (r & m) != 0 |
| Todos ativos | (r & m) == m |
| Ligar, limpar ou inverter | r | m, r & ~m, r ^ m |
Nomear o bit n | BIT(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
0x23devolve 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 escreve0xE8e depois0x03na mesma porta0x22. 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
0x60e 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 , um evento que permanece disponível espera aproximadamente entre 0 e . Se a chegada for uniforme, a média é .
- Polling serve uma resposta curta esperada; interrupções permitem bloquear à espera de eventos. Decide pela carga, latência admissível e capacidade do buffer.