Veja também as respostas sobre estas questões:
- Por que não incluímos drivers do Sistema de Arquivos no próprio kernel em vez de usar o Initrd / Initramfs
- Por que precisamos de initramfs e initrd
1. Por que não o kernel em si deve incluir os drivers necessários dentro dele
Primeiramente, saiba que a memória do kernel não é paginada por demanda. Isso seria uma dependência circular. Se você distribuir seu driver de disco para o disco quando estiver com pouca memória, não será possível carregá-lo novamente mais tarde.
(E dentro do kernel do Linux, nós não tentamos definir uma camada superior que não está envolvida no caminho de armazenamento e pode ser paginada com segurança. Supostamente isso é possível: o Windows fez isso. Eu não sei o que esta camada superior supostamente deveria ser. Talvez seja definida dinamicamente. Ou talvez o Windows tenha o luxo de não suportar idéias estranhas como swap-over-NFS).
Em vez disso, suportamos módulos de carregamento. Se não precisarmos do NFS neste computador em particular, não precisamos carregá-lo.
Em uma distribuição moderna, isso economiza na ordem de cem megabytes de RAM em geral. (Observe o espaço ocupado por /lib/modules/$VERSION/
. Observe que, nas distribuições modernas, os módulos são compactados, por exemplo, .xz
files).
2. e por que isso depende do initrd
Enquanto os módulos do kernel são a razão mais óbvia para o initrd, existe um segundo aspecto.
Ele permite que o userspace construa pilhas de armazenamento arbitrariamente complexas para acessar o sistema de arquivos raiz. Por exemplo. obter um endereço IP usando DHCP, para dar suporte a NFS ou solicitar uma frase secreta de criptografia de disco.
Mais uma vez, o kernel tenta não inchar demais, por ex. com o código da interface do usuário.
O uso da memória é apenas um dos motivos. A divisão kernel / userspace está sobrecarregada com vários propósitos. Por exemplo. o kernel pode ser um projeto e trabalhar especificamente em coisas do kernel. O espaço do usuário pode ser qualquer coisa; poderia ser uma distribuição Linux "normal", ou poderia ser um projeto totalmente independente como o sistema operacional Android.
Isso é diferente de outros sistemas operacionais, por exemplo, os BSDs mantêm o kernel + núcleo userspace juntos. Isso é ilustrado pelo fato de os BSDs poderem lidar com o problema 2038 com uma única conversão do kernel e do espaço do usuário no .
>