Quais drivers de dispositivo estão embutidos no kernel?

14

Recentemente, instalei um fornecedor fornecido linux incorporado em um dispositivo de hardware. Quando eu corri lsmodna linha de comando do dispositivo, a resposta estava vazia. Eu fui levado a acreditar que isso significa que os drivers para o hardware em execução no dispositivo foram incorporados ao kernel, e não como arquivos .ko. Minha pergunta é a seguinte: como esse processo acontece?

O suporte ao hardware popular está gradualmente integrado ao kernel nas versões subseqüentes, substituindo os arquivos .ko? O arquivo .ko é simplesmente usado para oferecer suporte a novo hardware que não possui suporte de driver integrado ao kernel no momento do lançamento? Pelo meu conhecimento limitado, pensei que todos os drivers de hardware tinham a forma de arquivos .ko, mas claramente isso está errado.

Estou um pouco confuso com todo o processo e ficaria grato pelo esclarecimento, pois tenho a sensação de que posso estar vendo a situação da maneira errada.

mathematician1975
fonte

Respostas:

10

Os drivers principais que são considerados críticos para o carregamento do kernel geralmente são embutidos no kernel, enquanto outros drivers de hardware etc. são criados como módulos ou arquivos .ko .

Os módulos .ko geralmente são armazenados no /libdiretório em sua partição raiz. Para usar qualquer um desses, o kernel deve primeiro ser capaz de detectar e acessar o dispositivo de armazenamento subjacente e, em seguida, acessar seu sistema de arquivos. Portanto, é seguro supor que um kernel sem o suporte SATA / SCSI e ext2 / 3/4 incorporado não será realmente inicializado;)

Você pode optar por alternar a maioria dos drivers internos do kernel para o formato de módulo. A equipe de kernel do Ubuntu decide se deve modificar a configuração padrão da equipe de kernel do Linux e incluir / excluir drivers internos adicionais para as imagens de kernel que você baixa.

Se você construir seu próprio kernel, poderá fazer o mesmo:

insira a descrição da imagem aqui

  • Na captura de tela acima, *indica um driver embutido, enquanto Mindica um módulo.
  • O suporte ao dispositivo de loopback, que geralmente é essencial para inicializar um sistema, é incorporado por padrão.
  • O driver USB de baixa velocidade (USB 1.0) também é embutido por padrão para permitir que você inicialize um pendrive, mas aqui eu o troquei em um módulo.
ish
fonte
Obrigado, isso ajuda muito. Eu acho que vou entender melhor isso quando eu fizer uma compilação do kernel do zero para mim.
mathematician1975
3

Ao compilar um kernel , você pode configurar quais componentes estão instalados. Não apenas isso, mas você escolhe se eles são ou não incorporados ao kernel ou se são um módulo .

Por exemplo, muitas pessoas usam o sistema de arquivos ext2 em sua partição / boot . Por isso, o kernel deve poder ler os sistemas de arquivos ext2 no momento da inicialização. Para conseguir isso, o módulo ext2 é incorporado ao próprio kernel.

Agora, imagine a quantidade de módulos disponíveis. Não faria sentido tê-los todos embutidos no seu kernel, faria? É por isso que você pode construí-los como módulos .ko separados e carregá-los à vontade.

earthmeLon
fonte
1
Sim, seu último parágrafo foi o que motivou minha pergunta a ser honesta. Obrigado pela resposta
mathematician1975
1

Isso depende de como você configurou sua compilação do kernel do linux.

Dentro de um processo de compilação, você geralmente pode:

  • compilar o kernel com ou sem suporte ao módulo (geralmente ele vem com suporte ao módulo)
  • compile um driver como módulo ou como um software embutido diretamente no kernel

para entender o que é um arquivo .ko para /programming/10476990/difference-between-o-and-ko-file

A razão pela qual você tem uma saída vazia lsmodé porque você tem um kernel monolítico.

Uma maneira rápida de listar todos os seus módulos (se houver) é executando este comando

find /lib/modules/*/ -type f -iname '*.ko' | less

observe o uso de less, você pode usar todos os pagers desejados ou redirecionar a saída para onde desejar.

user827992
fonte
Portanto, em um kernel configurado sem suporte de módulo (como o meu parece ser), eu não conseguiria instalar nenhum driver na forma de arquivos .ko para usar hardware adicional?
mathematician1975
Sim, basicamente você precisa recompilar o código-fonte, se você deseja editar e / ou adicionar drivers, é necessário reconstruí-lo, talvez use apenas o mesmo .configarquivo e modifique-o conforme necessário.
user827992
Portanto, para fazer isso, eu precisaria obter o código-fonte do kernel do fornecedor, compilá-lo com as modificações corretas no arquivo .config e será bom instalar outros drivers?
mathematician1975
depende, se ele usou um kernel baunilha (sem nada além do código fonte original), você está bem apenas com o .config e pode reproduzir o mesmo kernel apenas com o seu PC, no entanto, se ele usou um kernel baunilha + alguns patches ou modificações Se você precisar dessas informações adicionais, um Makefile personalizado também pode ser considerado uma variável relevante, como qualquer outra modificação na cadeia de ferramentas padrão e, em geral, no processo de criação padrão.
user827992
É minha experiência que os módulos estão desabilitados para Linux embarcado, por motivos de velocidade e tamanho, e que os kernels desses dispositivos geralmente contêm drivers fora da árvore e são construídos no PC de algum funcionário aleatório sem o benefício do controle de origem. Boa sorte com isso.
Stephen M. Webb
0

Veja o conteúdo do arquivo / lib / modules / $ (uname -r) /modules.builtin

por exemplo, para procurar um módulo específico

grep <module> /lib/modules/$(uname -r)/modules.builtin

Documentação / kbuild / kbuild.txt

modules.builtin
--------------------------------------------------
This file lists all modules that are built into the kernel. This is used
by modprobe to not fail when trying to load something builtin.
Andrew
fonte
??? Não tenho certeza do que o OP deve fazer. Ele deveria executar a primeira linha no terminal? Esta poderia ser a resposta, mas você poderia elaborar um pouco?
anonymous2
0
ls /sys/module

parece conter todos os módulos internos e externos.

Mas também parece conter algumas entradas que na verdade não são módulos: /unix/225706/are-modules-listed-under-sys-module-all-the-loaded-modules

TODO: leia a fonte e entenda com mais precisão o que é colocado lá.

A vantagem deste método é que você não confia em encontrar a configuração do kernel em /bootou /proc/config.gz.

Ciro Santilli adicionou uma nova foto
fonte