Qual é a vantagem de compilar módulos do kernel no kernel (em vez de como módulos carregáveis)?
Depende. Se você tiver uma pequena quantidade de memória, o uso de módulos pode melhorar o currículo, pois eles não são recarregados todas as vezes (achei significativo em 2 GiB de RAM, mas não em 4 GiB em discos rígidos tradicionais). Isso é especialmente verdadeiro quando devido a algum bug no módulo de bateria (independentemente de ser compilado ou como módulo), ele demorou muito para iniciar (vários minutos). Mesmo sem bug no gentoo eu consegui encurtar o tempo (relatado por systemd-analysis
) De 33s para 18s apenas mudando do kernel compilado estaticamente para módulos - 'surpreendentemente' o início do kernel mudou de 9s para 1.5s.
Além disso, quando você não sabe que hardware vai usar, os módulos são claramente benéficos.
PS. Você pode compilar até mesmo drivers vitais como módulos, desde que os inclua no initrd. Por exemplo, distros incluirão o sistema de arquivos de /, drivers de disco rígido etc. no initrd na instalação.
Pelo que eu sei, não há diferença de velocidade.
Acho que você ganhará alguns kB de memória do kernel, já que a granularidade das alocações é de uma página, então, na arquitetura típica, cada módulo desperdiça uma média de cerca de 2 kB (½ página) por módulo em potencial. Mesmo em sistemas embarcados, isso é pouco significativo. Você também ganha um pouco de espaço em disco, pois os módulos podem ser compactados da mesma forma que o kernel; que pode ser mais relevante em sistemas embarcados com pouco armazenamento.
Se você pode dispensar todos os módulos, você economiza um pouco de memória do kernel (sem necessidade de carregador de módulo), espaço em disco (sem necessidade de utilitários de módulo) e complexidade do sistema (sem necessidade de incluir o carregamento de módulo como um recurso em sua distribuição ) Esses pontos são bastante atraentes em alguns designs embarcados em que o hardware não é extensível.
Alguns benefícios potenciais. O desempenho é discutível. Você evitaria alguma sobrecarga de tempo de execução associada a um carregador dinâmico, mas duvido que seja um grande negócio, a menos que você dependa de um agendador em tempo real.
Se você está aproveitando as vantagens de páginas grandes em seu sistema, talvez a criação de uma imagem de kernel estática maior signifique usar mais eficientemente o cache do descritor de página. Alguns sistemas 'prendem' o kernel de forma que ele seja compactado firmemente em uma localidade de memória, o que pode aliviar algum atraso devido a falhas de página menores e possivelmente maiores.
Pode ser adequado para você, arquitetonicamente, entregar One Big Image, argumentando que menos módulos independentes são mais fáceis de manter e a perda de flexibilidade não é importante. Muito desse tipo de raciocínio se aventura em questões de estilo e prática.
Às vezes é necessário. Se você compilar algum driver vital (por exemplo, driver SCSI) como um módulo, seu sistema não inicializará.
Outro grande candidato para não compilar como um módulo é o tipo de sistema de arquivos da partição raiz. Se o kernel não entender ext3
ler /lib/modules/
como ele vai carregar os módulos dele?
Pense desta forma: para usar módulos, o kernel precisa saber o suficiente sobre o seu sistema para ler e carregar os módulos do kernel. Use isso e tentativa e erro :-)
Eu compilo estaticamente cada driver para hardware embutido dentro do kernel. A exceção seria o hardware que não é permanente (hardware conectado por USB, por exemplo).
Como minha configuração de hardware não deve mudar tão cedo, não me preocupo com os módulos.