Weeeeellll .....
Um módulo do kernel é algo muito específico: uma parte do kernel que está sendo carregada como um módulo (ou seja, dinamicamente), depois que o kernel principal é iniciado. Isso pode ser qualquer coisa.
Para usar o hardware, você precisa de algumas partes que residem principalmente no kernel por dois motivos:
- Para poder executar operações de hardware que não podem ser feitas ou que são impraticáveis no espaço do usuário ou para manter o estado fora do escopo do processo.
- Porque seria muito ineficiente fazer no espaço do usuário
Para gerenciar a maioria dos hardwares, você precisa de uma contraparte do espaço do kernel. Isso pode ser compilado como parte do kernel ou como um módulo que é carregado posteriormente sob demanda. Com os módulos, é possível não carregar todos eles.
Mas os módulos não precisam estar relacionados apenas ao hardware. Existem módulos que apenas adicionam funcionalidade como (por exemplo) ipv6, opções de firewall, etc.
Um driver, por outro lado, é algo que fornece acesso fácil ao hardware em geral. Geralmente incorpora todas as coisas específicas do hardware e expõe uma API genérica. E por genérico quero dizer algo que é genérico o suficiente, mas não necessariamente global ou padrão. Por exemplo. um driver para placas gráficas ATI exporá uma API comum para todas as placas ATI, mas pode não ser o mesmo que outras placas.
Os drivers podem ser feitos no espaço do usuário, no kernel (embutido ou módulo) ou podem ter pernas em ambas as extremidades. Por exemplo, os drivers da placa gráfica de nowdays têm uma parte no kernel e uma parte no espaço do usuário (por exemplo, o servidor X, DRI, etc)