Qual é a diferença entre os drivers do kernel e os módulos do kernel?

60

Quando eu faço um lspci -k no meu Kubuntu com um kernel 3.2.0-29-genérico eu posso ver algo assim:

01:00.0 VGA compatible controller: NVIDIA Corporation G86 [Quadro NVS 290] (rev a1)
    Subsystem: NVIDIA Corporation Device 0492
    Kernel driver in use: nvidia
    Kernel modules: nvidia_current, nouveau, nvidiafb

Existe um driver do kernel nvidia e módulos do kernel nvidia_current , nouveau , nvidiafb .

Agora eu queria saber qual seria a diferença entre os drivers do Kernel e os módulos do Kernel?

    
por JohnnyFromBF 05.09.2012 / 10:24

6 respostas

71

Um módulo do kernel é um código compilado que pode ser inserido no kernel em tempo de execução, como em insmod ou modprobe .

Um driver é um código que é executado no kernel para falar com algum dispositivo de hardware. Isso "impulsiona" o hardware. A maioria dos hardwares do seu computador possui um driver associado.¹ Uma grande parte de um kernel em execução é o código do driver.²

Um driver pode ser construído estaticamente no arquivo do kernel no disco.³ Um driver também pode ser construído como um módulo do kernel para que possa ser carregado dinamicamente posteriormente. (E então talvez descarregado.)

A prática padrão é construir drivers como módulos do kernel, sempre que possível, em vez de vinculá-los estaticamente ao kernel, já que isso dá mais flexibilidade. Há 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 construídos podem ser exatamente o que você quer em um sistema com escopo estatístico, como um sistema incorporado . Ou seja, se você souber de antemão exatamente quais drivers serão sempre necessários e que isso nunca mudará, você tem uma boa razão para não se incomodar 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, você evita a modificação em tempo de execução do código do kernel. Isso proporciona 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 mais complexos de hardware geralmente têm várias camadas genéricas que ficam entre o driver de hardware de baixo nível e o userland, como o Um driver HIDUSB , que implementa um elemento específico da USB stack , independente do hardware subjacente.

Além disso:

  1. Uma exceção a esta afirmação geral é o chip da CPU, que não tem "driver" per se . Seu computador também pode conter hardware para o qual você não possui driver.

  2. O restante do código em um kernel do sistema operacional fornece serviços genéricos como gerenciamento de memória , IPC , scheduling , etc. Esses serviços podem servir principalmente a aplicativos userland , como com os exemplos vinculados anteriormente, ou podem ser serviços internos usados por drivers ou outras infraestruturas dentro do kernel.

  3. O em /boot , carregado na RAM no momento da inicialização pelo carregador de boot no início do processo de inicialização .

por 05.09.2012 / 17:38
15

Para responder à sua pergunta específica sobre a saída lspci , a linha "driver do kernel" refere-se a qual driver está atualmente vinculado à placa, neste caso, o driver proprietário nvidia . A linha "módulos do kernel" lista todos os drivers conhecidos por serem capazes de se vincular a esta placa. Aqui, o driver proprietário mostra um nome diferente, provavelmente devido a lspci ter encontrado o driver e seu nome de arquivo versus o nome codificado no próprio driver.

    
por 05.09.2012 / 16:33
5

De acordo com este belo tutorial :

...one type of module is the device driver, which allows the kernel to access hardware connected to the system.

Então, se tentarmos desenhar uma árvore, teremos "Device driver" que herda de (extends) Module, e que possui características mais específicas, entre as quais encontramos "acessando hardware" ...

    
por 22.08.2013 / 16:51
4

Um módulo do kernel pode não ser um driver de dispositivo.

"Kernel driver" não é um termo bem definido, mas vamos tentar.

Este é um módulo do kernel que não direciona nenhum hardware e, portanto, não poderia ser considerado um "driver de dispositivo":

#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");

static int myinit(void)
{
    printk(KERN_INFO "hello init\n");
    return 0;
}

static void myexit(void)
{
    printk(KERN_INFO "hello exit\n");
}

module_init(myinit)
module_exit(myexit)

Após a compilação, você pode usá-lo com:

insmod hello.ko

e imprime hello init a dmesg .

Existem, no entanto, 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.

Os drivers de dispositivos 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, já que requer um hardware para ser usado, e as descrições de hardware tendem a ser complicadas.

Usando o QEMU ou outros emuladores, no entanto, podemos construir modelos de software de hardware real ou simplificado, o que é uma ótima maneira de aprender a falar com o hardware. Aqui está um exemplo simples de um driver de dispositivo PCI mínimo: link

Em seguida, vemos que em x86, conversando com hardware se resume a:

  • in e out instruções, por exemplo, link
  • lidando com interrupções registrando manipuladores com a CPU

Essas operações não podem, em geral, ser feitas a partir da userland, 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: .

O kernel, então, oferece APIs de nível mais alto para tornar essa interação de hardware mais fácil e mais portátil:

  • request_irq para lidar com interrupções
  • ioreadX e mapeamento de memória IO
  • interfaces de nível ainda mais alto para protocolos populares como PCI e USB
por 18.06.2017 / 10:59
0

Minha resposta irá com Jim. Um driver de kernel é um programa (módulo de kernel) projetado para controlar uma peça de hardware. A saída lspci diz que a nvidia é o driver do kernel, pois é o módulo loaded para o dispositivo. Junto com ele, há outros módulos de kernel disponíveis.

Acrescentarei que os comandos no linux para listar e remover drivers são lsmod e rmmod , respectivamente. O que diz módulo de lista e remove o módulo.

    
por 05.09.2012 / 19:52
0

Todos os drivers são módulos. Nem todos os módulos são drivers.

Os módulos podem ser inseridos em tempo de execução. Módulos / Drivers podem ser estaticamente compilados junto com o kernel também.

O módulo típico init tem

module_init(init_fn);
init_fn()
{
   /* some code */
}

O mesmo módulo pode ser feito um driver

module_init(init_fn);
init_fn()
{
   device_register(&device);
   /* some code */
}
    
por 05.09.2012 / 15:04