Um módulo do kernel é um pouco de código compilado que pode ser inserido no kernel em tempo de execução, como com insmod
ou modprobe
.
Um driver é um pouco de código que é executado no kernel para conversar com algum dispositivo de hardware. "Conduz" o hardware. Quase todo hardware do seu computador possui um driver associado.¹ Grande parte do kernel em execução é o código do driver.²
Um driver pode ser incorporado estaticamente no arquivo do kernel no disco.³ Um driver também pode ser criado como um módulo do kernel, para que possa ser carregado dinamicamente mais tarde. (E talvez descarregado.)
A prática padrão é criar drivers como módulos do kernel sempre que possível, em vez de vinculá-los estaticamente ao kernel, pois isso oferece mais flexibilidade. Existem boas razões para não, no entanto:
Às vezes, um determinado driver é absolutamente necessário para ajudar o sistema a inicializar. Isso não acontece com a frequência que você imagina, devido ao recurso initrd .
Drivers estaticamente criados podem ser exatamente o que você deseja em um sistema com escopo estaticamente, como um sistema incorporado . Ou seja, se você souber com antecedência exatamente quais drivers serão sempre necessários e que isso nunca mudará, você tem um bom motivo para não se preocupar com os módulos dinâmicos do kernel.
Se você construir seu kernel estaticamente e desativar o recurso de carregamento de módulo dinâmico do Linux, evite a modificação em tempo de execução do código do kernel. Isso fornece segurança e estabilidade adicionais à custa da flexibilidade.
Nem todos os módulos do kernel são drivers. Por exemplo, um recurso relativamente recente no kernel do Linux é que você pode carregar um agendador de processos diferente . Outro exemplo é que os tipos de hardware mais complexos geralmente têm várias camadas genéricas que ficam entre o driver de hardware de baixo nível e a área do usuário, como o driver USB HID , que implementa um elemento específico da pilha USB , independente do hardware subjacente.
Apartes:
Uma exceção a essa declaração ampla é o chip da CPU, que não possui "driver" em si . Seu computador também pode conter hardware para o qual você não possui driver.
O restante do código em um kernel do SO fornece serviços genéricos como gerenciamento de memória , IPC , agendamento , etc. Esses serviços podem servir principalmente a aplicativos da terra do usuário , como nos exemplos vinculados anteriormente, ou podem ser serviços internos usados por drivers ou outros infraestrutura de kernel.
Aquele /boot
carregado na RAM no momento da inicialização pelo carregador de inicialização no início do processo de inicialização .
man lspci
: "-k Mostra os drivers do kernel manipulando cada dispositivo e também os módulos do kernel capazes de manipulá- lo." Você pode ler isso como: "Mostrar o driver atualmente / realmente manipulando o dispositivo e também todos os módulos que podem / devem ser manipulados ".Para responder sua pergunta específica sobre a
lspci
saída, a linha "driver do kernel" refere-se a qual driver está atualmente vinculado à placa, nesse caso, onvidia
driver proprietário . A linha "módulos do kernel" lista todos os drivers conhecidos por serem capazes de vincular a esta placa. Aqui, o driver proprietário mostra um nome diferente, provavelmente devido àlspci
localização do driver e seu nome de arquivo versus o nome codificado no próprio driver.fonte
man lspci
- diz exatamente o que você escreveu.De acordo com este bom tutorial :
Portanto, se tentarmos desenhar uma árvore, teremos o "Driver de dispositivo" que herda do módulo (estende) e que possui características mais específicas, entre as quais encontramos "acesso ao hardware" ...
fonte
Um módulo do kernel pode não ser um driver de dispositivo.
"Driver do kernel" não é um termo bem definido, mas vamos tentar.
Este é um módulo do kernel que não conduz nenhum hardware e, portanto, não pode ser considerado razoavelmente um "driver de dispositivo":
Após a compilação, você pode usá-lo com:
e imprime
hello init
paradmesg
.No entanto, existem módulos do kernel que não são drivers de dispositivo, mas são realmente úteis, por exemplo, módulos que expõem informações de depuração / desempenho do kernel.
Drivers de dispositivo geralmente também são módulos do kernel.
Um exemplo de algo que é um "driver de dispositivo" é um pouco mais difícil de gerar, pois requer um hardware para dirigir e as descrições de hardware tendem a ser complicadas.
No entanto, usando o QEMU ou outros emuladores, podemos construir modelos de software de hardware real ou simplificado, o que é uma ótima maneira de aprender a conversar com o hardware. Aqui está um exemplo simples de um driver de dispositivo PCI mínimo: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module/hello.c
Vemos então que, no x86, conversar com o hardware se resume a:
in
eout
instruções, por exemplo, https://stackoverflow.com/questions/3215878/what-are-in-out-instructions-in-x86-used-for/33444273#33444273Em geral, essas operações não podem ser realizadas a partir da terra do usuário, conforme explicado em: Qual é a diferença entre o espaço do Usuário e o espaço do Kernel? No entanto, existem algumas exceções: https://stackoverflow.com/questions/7986260/linux-interrupt-handling-in-user-space .
O kernel oferece APIs de nível superior para tornar essa interação de hardware mais fácil e mais portátil:
request_irq
lidar com interrupçõesioreadX
mapeamento de memória IOfonte
Minha resposta vai com Jim. Um driver do kernel é um programa (módulo do kernel) projetado para conduzir uma peça de hardware. A saída lspci diz que a nvidia é o driver do kernel, pois é o
loaded
módulo do dispositivo. Junto com ele vem outros módulos de kernel disponíveis.Vou acrescentar que os comandos no linux para listar e remover drivers são
lsmod
ermmod
respectivamente. O que diz listar módulo e remover módulo.fonte
Todos os drivers são módulos. Nem todos os módulos são drivers.
Módulos podem ser inseridos em tempo de execução. Módulos / Drivers também podem ser compilados estaticamente, juntamente com o kernel.
O módulo típico init possui
O mesmo módulo pode ser um driver
fonte