Os drivers do Linux são parte do kernel ou do rootfs

4

Eu tenho trabalhado em uma placa com um processador ARM embutido. Para obtê-lo, eu tenho que adicionar um bootloader, um kernel Linux e uma imagem de disco contendo o sistema de arquivos raiz. Esta imagem de disco está disponível na internet para o quadro de destino (ZedBoard).

Depois de compilar o kernel com todos os drivers necessários ativados, descobri que muitos drivers estão disponíveis em / lib / modules / kernel_number.

Estou um pouco confuso sobre como tudo isso funciona. Os drivers são carregados pelo kernel? Em caso afirmativo, por que eles já fazem parte dos rootfs? ou o kernel as sobrescreve com as compiladas?

    
por devhallo 12.11.2014 / 17:53

2 respostas

7

É bastante simples, embora devamos distinguir entre "driver" e "module". Um driver pode ou não ser um módulo. Se não for, então ele é embutido no kernel carregado pelo bootloader.

Se for um módulo, então ele está em uma hierarquia de sistema de arquivos com raiz em /lib/modules/[kernel-release] . 1 Note que é possível inicializar um kernel junto com um pequeno sistema de arquivos raiz preliminar (um "initramfs" ") que pode conter tal repositório também. Isso é normal com os kernels genéricos para que eles possam decidir quais drivers modulares eles precisam carregar para acessar o sistema de arquivos real, já que se eles não puderem fazer isso, eles não poderão acessar nenhum módulo lá.

Are drivers loaded by the kernel ?

Sim.

if so why are they already a part of the rootfs ?

Onde mais eles devem ser armazenados antes de serem carregados? O kernel não contém o rootfs dentro dele (exceto WRT algumas formas de initramfs), é apenas o gatekeeper.

does the kernel overwrite them with the ones compiled in it ?

Não. Se você compilar um driver, o kernel não se importará em verificar /lib/modules para ele. Eu não tenho certeza do que acontece se você perguntar explicitamente para carregar um driver desse tipo, presumivelmente ele simplesmente dirá não.

1. Como Celada sugere com $(uname -r) , esta string de lançamento não é necessariamente apenas o número da versão. Você pode ter vários kernels com a mesma versão e diferentes strings de liberação, portanto, armazenamentos de módulos separados. Da mesma forma, você pode ter vários kernels com a mesma string de lançamento, portanto, o mesmo armazenamento de módulo.

    
por 12.11.2014 / 18:07
4

No Linux, a maioria dos drivers pode ser construída estaticamente no kernel ou construída como módulos. Esta é uma escolha que você pode fazer quando o kernel está sendo configurado para compilação. Eles só aparecerão em /lib/modules/$(uname -r) se forem criados como módulos carregáveis.

Normalmente, para sistemas de uso geral, especialmente para kernels pré-compilados disponibilizados como parte das distribuições Linux, o conjunto mínimo de drivers será construído estaticamente e, tanto quanto possível, será construído como módulos. Isso permite que o sistema de cada usuário carregue apenas os módulos necessários, sem saber com antecedência o que eles são.

Kernels para sistemas embarcados são frequentemente construídos com muito mais drivers embutidos, porque o kernel está sendo construído para um sistema com um conjunto muito específico de hardware imutável e o integrador de sistemas sabe de antemão o que é. No entanto, muitos drivers são frequentemente deixados para serem carregados como módulos, especialmente para hardware "extra" que pode ou não estar presente como dispositivos USB.

    
por 12.11.2014 / 18:00