O kernel inteiro está carregado na memória durante a inicialização?

14

Eu li através deste este popular documento IBM (eu o vejo bastante frequentemente na web) explicando a função do disco RAM inicial.

Eu acertei uma parede para conceituar como isso funciona.

No documento diz

The boot loader, such as GRUB, identifies the kernel that is to be loaded and copies this kernel image and any associated initrd into memory

Eu já estou confuso: copia o kernel inteiro na memória ou apenas parte dele? Se o kernel inteiro estiver na memória, então por que precisamos do disco de RAM inicial?

Eu pensei que o propósito do initrd era poder ter uma pequena imagem do kernel generalizada e o initrd instalaria os módulos corretos antes que a imagem do kernel fosse carregada. Mas se o kernel inteiro já estiver na memória, por que precisamos do initrd?

Isso também traz outra coisa que me confunde - onde estão os módulos que são carregados no kernel? Todos os módulos do kernel estão armazenados dentro do initrd?

    
por user1028270 26.01.2016 / 19:20

3 respostas

17

O kernel inteiro é carregado na memória durante a inicialização, normalmente junto com um initramfs atualmente. (Ainda é possível configurar um sistema para inicializar sem um initramfs , mas isso é incomum em desktops e servidores.)

A função initramfs é fornecer a funcionalidade necessária para montar os sistemas de arquivos "reais" e continuar inicializando o sistema. Isso envolve módulos do kernel, e também vários binários: você precisa de pelo menos udev , talvez alguma rede, e kmod que carrega módulos.

Os módulos podem ser carregados no kernel depois de inicializar, então não há preparação especial do kernel pelo initramfs . Eles podem ser armazenados em qualquer lugar: o initramfs , /lib/modules no sistema de arquivos real, em uma árvore de desenvolvimento se você estiver desenvolvendo um módulo ... O initramfs precisa conter apenas os módulos que são necessários para montar a raiz sistema de arquivos (que contém o restante).

    
por 26.01.2016 / 19:42
5

O kernel inteiro (mas não seus módulos) será carregado na memória. Se houver módulos que o kernel precisará antes que qualquer sistema de arquivos esteja disponível (isso geralmente significa os drivers para os sistemas de arquivos e seus dispositivos), então esses módulos estarão no initramfs (na memória), eo kernel irá carregá-los de lá. Outros módulos podem ser carregados posteriormente a partir do sistema de arquivos.

    
por 26.01.2016 / 19:25
3

O kernel nas configurações modernas do Linux é strongmente baseado em módulos, ou seja, o kernel adequado (carregado na inicialização na RAM) inclui apenas a funcionalidade mínima, todo o resto é compilado como módulos (carregáveis em tempo de execução). Para fazer isso funcionar mesmo quando, por exemplo, os dispositivos ou sistemas de arquivos necessários para a inicialização são módulos, um initramfs é carregado com o kernel (como o nome indica, esta é uma área RAM com um sistema de arquivos simples, montado na inicialização). Esse sistema de arquivos temporário é montado em / e contém programas de inicialização e os módulos necessários. Quando a inicialização em initramfs for concluída, o Linux executará um pivot_root(8) , colocando o verdadeiro / e lançando o conteúdo initramfs .

O ponto dessa complexidade é que, e. uma distribuição pode compilar o kernel one (kernel mínimo e conjunto completo de módulos) e, na instalação do kernel, criar um initramfs adaptado ao hardware e à configuração da máquina de destino. Tudo isso é necessário devido à grande variedade de dispositivos e configurações de "computadores pessoais".

    
por 26.01.2016 / 21:52