Um driver de dispositivo se comunica com um dispositivo usando uma variedade de métodos, dependendo do tipo de dispositivo e do sistema operacional. A comunicação raramente é direta; Em vez disso, depende de camadas intermediárias e interfaces padronizadas. Aqui está um colapso:
1. Interfaces específicas de hardware: *
E/S mapeada de memória (mmio): Os registros do dispositivo são mapeados no espaço de endereço de memória do sistema. O driver lê e grava nesses endereços de memória para controlar o dispositivo. Isso é comum para muitos dispositivos, incluindo placas gráficas e cartões de interface de rede (NICs). O motorista interage diretamente com os registros de hardware físico.
*
E/S mapeada por porta (PIO): O dispositivo é acessado através de portas específicas de entrada/saída. O driver envia comandos e recebe dados escrevendo e lendo essas portas. Isso é menos comum agora, mas ainda encontrado nos sistemas herdados. Como MMIO, é uma interação direta.
*
Interrupções: O dispositivo interrompe a CPU quando precisar de atenção (por exemplo, os dados estão prontos, ocorreu um erro). A interrupção desencadeia um manipulador de interrupção específico dentro do driver, permitindo que o driver responda ao evento do dispositivo. Isso é crucial para operações assíncronas.
*
Acesso à memória direta (DMA): O dispositivo pode acessar diretamente a memória do sistema sem intervenção da CPU, melhorando o desempenho. O motorista configura a transferência de DMA, liberando a CPU para outras tarefas.
2. Interfaces de software (camadas de abstração): As interações brutas de hardware descritas acima são normalmente abstraídas por camadas de software para fornecer uma interface mais gerenciável e portátil. Estes incluem:
*
kernel do sistema operacional: O motorista opera dentro do kernel do sistema operacional. Ele utiliza serviços de kernel para acessar recursos de hardware e interagir com outras partes do sistema.
*
APIs específicas do dispositivo: Os sistemas operacionais geralmente fornecem APIs (interfaces de programação de aplicativos) específicas para determinados tipos de dispositivos (por exemplo, SCSI, SATA, USB). Essas APIs simplificam o desenvolvimento do motorista, abstraindo detalhes de baixo nível.
*
Interfaces específicas do barramento: O dispositivo está conectado ao sistema através de um barramento (por exemplo, PCI, USB, SATA). O motorista usa protocolos e interfaces específicos do barramento para se comunicar com o dispositivo sobre o barramento.
em resumo: O processo de comunicação pode ser visualizado da seguinte maneira:
1.
Aplicativo (usuário ou sistema): Solicita uma operação (por exemplo, leitura de dados de um disco rígido).
2. Sistema operacional
: Rotas a solicitação para o driver de dispositivo apropriado.
3.
Driver de dispositivo: Usa a interface apropriada específica de hardware (MMIO, PIO, etc.) e abstrações de software para se comunicar com o dispositivo. Isso pode envolver o envio de comandos, recebendo dados, interrupções de manuseio ou gerenciamento de transferências de DMA.
4.
dispositivo: Executa a operação solicitada e envia o resultado (se houver) de volta ao driver.
5.
Driver de dispositivo: Processa a resposta e retorna o resultado ao sistema operacional.
6. Sistema operacional
: Retorna o resultado para o aplicativo.
A complexidade da comunicação depende muito da sofisticação do dispositivo e do sistema operacional. Os sistemas modernos geralmente utilizam várias camadas de abstração para simplificar o desenvolvimento do motorista e melhorar a portabilidade.