Qual é o conteúdo dessa base de código monolítica?
Entendo o suporte à arquitetura do processador, a segurança e a virtualização, mas não consigo imaginar que sejam mais de 600.000 linhas.
Quais são os motivos históricos e atuais dos drivers incluídos na base de código do kernel?
Essas mais de 15 milhões de linhas incluem todos os drivers para cada peça de hardware de todos os tempos? Em caso afirmativo, isso levanta a questão: por que os drivers são incorporados ao kernel e não separam pacotes detectados e instalados automaticamente a partir de IDs de hardware?
O tamanho da base de código é um problema para dispositivos com restrição de armazenamento ou memória?
Parece que aumentaria o tamanho do kernel para dispositivos ARM com espaço limitado, se tudo isso fosse incorporado. Muitas linhas são selecionadas pelo pré-processador? Me chame de louca, mas não consigo imaginar uma máquina que precise de tanta lógica para executar o que entendo são os papéis de um kernel.
Há evidências de que o tamanho será um problema em mais de 50 anos devido à sua natureza aparentemente crescente?
Incluir drivers significa que ele crescerá à medida que o hardware for fabricado.
EDIT : Para aqueles que pensam que essa é a natureza dos kernels, depois de algumas pesquisas, percebi que nem sempre é. Não é necessário que um kernel seja tão grande, pois o microkernel Mach de Carnegie Mellon foi listado como um exemplo 'geralmente com menos de 10.000 linhas de código'
fonte
make menuconfig
para ver quanto do código pode ser ativado / desativado antes da criação.Respostas:
Os drivers são mantidos no kernel; portanto, quando uma alteração no kernel requer uma pesquisa e substituição global (ou pesquisa e modificação manual) para todos os usuários de uma função, isso é feito pela pessoa que faz a alteração. Atualizar o driver por pessoas que fazem alterações na API é uma vantagem muito boa, em vez de precisar fazer isso sozinho, quando não compila em um kernel mais recente.
A alternativa (o que acontece com os drivers mantidos fora da árvore) é que o patch precisa ser sincronizado novamente por seus mantenedores para acompanhar as alterações.
Uma pesquisa rápida gerou um debate sobre o desenvolvimento de drivers in-tree vs. out-of-tree .
A maneira como o Linux é mantido é principalmente mantendo tudo no repositório principal. A construção de pequenos kernels despojados é suportada por opções de configuração para controlar
#ifdef
s. Portanto, você pode absolutamente construir minúsculos kernels despojados que compilam apenas uma pequena parte do código em todo o repositório.O uso extensivo do Linux em sistemas embarcados levou a um melhor suporte para deixar de fora as coisas do que o Linux tinha anos antes, quando a árvore de fontes do kernel era menor. Um kernel super-mínimo 4.0 é provavelmente menor que um kernel 2.4.0 super-mínimo.
fonte
De acordo com o cloc executado na versão 3.13, o Linux possui cerca de 12 milhões de linhas de código.
lsmod | wc
no meu laptop Debian mostra 158 módulos carregados em tempo de execução; portanto, carregar dinamicamente os módulos é uma maneira bem usada de suportar hardware.O sistema de configuração robusto (por exemplo
make menuconfig
) é usado para selecionar qual código compilar (e mais ao seu ponto, qual código não compilar). Os sistemas incorporados definem seu próprio.config
arquivo apenas com o suporte de hardware de que se preocupam (incluindo o suporte ao hardware incorporado ao kernel ou como módulos carregáveis).fonte
Para qualquer pessoa curiosa, aqui está o detalhamento da contagem de linha para o espelho do GitHub:
drivers
contribui para grande parte da contagem de linha.fonte
grep -Pir "\x66\x75\x63\x6b" /usr/src/linux/ | wc -l
./documentation
tem mais de 500.000 linhas de código? ....o que?As respostas até agora parecem ser "sim, há muito código" e ninguém está abordando a questão com a resposta mais lógica: 15M +? E DAÍ? O que 15M linhas de código fonte têm a ver com o preço do peixe? O que torna isso tão inimaginável?
O Linux claramente faz muito. Muito mais do que qualquer outra coisa ... Mas alguns de seus pontos mostram que você não respeita o que está acontecendo quando é construído e usado.
Nem tudo é compilado. O sistema de compilação do Kernel permite definir rapidamente configurações que selecionam conjuntos de códigos-fonte. Alguns são experimentais, alguns são antigos, outros simplesmente não são necessários para todos os sistemas. Veja
/boot/config-$(uname -r)
(no Ubuntu) emmake menuconfig
e você verá quanto é excluído.E essa é uma distribuição de desktop com destino variável. A configuração de um sistema embarcado apenas atrai as coisas necessárias.
Nem tudo está embutido. Na minha configuração, a maioria dos recursos do Kernel são construídos como módulos:
Para ser claro, tudo isso pode ser incorporado ... Assim como eles podem ser impressos e transformados em um sanduíche de papel gigante. Isso não faria sentido, a menos que você estivesse fazendo uma construção personalizada para um trabalho de hardware discreto (nesse caso, você já teria limitado o número desses itens).
Os módulos são carregados dinamicamente. Mesmo quando um sistema tem milhares de módulos disponíveis, o sistema permitirá que você carregue exatamente o que precisa. Compare as saídas de:
Quase nada está carregado.
Microkernels não são a mesma coisa. Apenas 10 segundos olhando para a imagem principal da página da Wikipedia que você vinculou destacaria que eles foram projetados de uma maneira completamente diferente.
Os drivers do Linux são internalizados (principalmente como módulos carregados dinamicamente), não o espaço do usuário, e os sistemas de arquivos são igualmente internos. Por que isso é pior do que usar drivers externos? Por que o micro é melhor para computação de uso geral?
Os comentários novamente destacam que você não está entendendo. Se você deseja implantar o Linux em hardware discreto (por exemplo, aeroespacial, TiVo, tablet etc.), configure-o para criar apenas os drivers necessários . Você pode fazer o mesmo na sua área de trabalho com
make localmodconfig
. Você acaba com uma compilação minúscula e específica do Kernel com flexibilidade zero.Para distribuições como o Ubuntu, um único pacote de 40 MB do Kernel é aceitável. Não, esfregue isso, é realmente preferível ao cenário maciço de arquivamento e download que manteria mais de 4000 módulos flutuantes como pacotes. Ele usa menos espaço em disco para eles, mais fácil de empacotar em tempo de compilação, mais fácil de armazenar e é melhor para seus usuários (que possuem um sistema que simplesmente funciona).
O futuro também não parece ser um problema. A taxa de velocidade da CPU, densidade de disco / preço e melhorias na largura de banda parecem muito mais rápidos que o crescimento do Kernel. Um pacote de 200 MB do Kernel em 10 anos não seria o fim se o mundo.
Também não é uma rua de mão única. O código é expulso se não for mantido.
fonte
tinyconfig gráfico de bolhas svg (violino)
shell script para criar o json a partir da compilação do kernel, use com http://bl.ocks.org/mbostock/4063269
Edit : acabou
unifdef
tendo alguma limitação (-I
é ignorado e-include
não é suportado; o último é usado para incluir o cabeçalho de configuração gerado) neste ponto, usandocat
não muda muito:script e procedimento atualizados.
Além de drivers, arco etc., há muito código condicional compilado ou não, dependendo da configuração escolhida, código não necessariamente em módulos carregados dinâmicos, mas construído no núcleo.
Então, baixei fontes linux-4.1.6 , peguei o tinyconfig , ele não habilita módulos e eu sinceramente não sei o que habilitar ou o que um usuário pode fazer com ele em tempo de execução, de qualquer forma, configure o kernel:
construiu o kernel
o processo de compilação do kernel deixa arquivos ocultos chamados
*.cmd
com a linha de comando usada também para compilar.o
arquivos, para processar esses arquivos e extrair a cópia de destino e dependênciasscript.sh
abaixo e usá-la com find :isso cria uma cópia para cada dependência do destino
.o
nomeado.o.c
código .c
.h cabeçalhos (higienizados)
fonte
As compensações dos núcleos monolíticos foram debatidas entre Tananbaum e Torvalds em público desde o início. Se você não precisa acessar o espaço do usuário para tudo, a interface para o kernel pode ser mais simples. Se o kernel for monolítico, ele poderá ser mais otimizado (e mais confuso!) Internamente.
Temos módulos como compromisso há um bom tempo. E continua com coisas como DPDK (movendo mais funcionalidades de rede do kernel). Quanto mais núcleos forem adicionados, mais importante será evitar o bloqueio; assim, mais coisas serão movidas para o espaço do usuário e o kernel diminuirá.
Observe que os núcleos monolíticos não são a única solução. Em algumas arquiteturas, o limite do kernel / espaço do usuário não é mais caro do que qualquer outra chamada de função, tornando os microkernels atraentes.
fonte