Iniciando o kernel do Linux (processo de boot)

1

Estou tentando entender o processo de inicialização do Linux:

Eu entendo que no primeiro estágio (definido pelo GRUB), o kernel (como um arquivo de imagem compactado) é carregado na memória e descompactado.

Quando o controle é passado para o kernel, como isso é realmente feito? O kernel é compilado a partir de seu código-fonte C e como o kernel é realmente executado?

Eu li este post, mas não parece responder minha pergunta:

O que acontece depois de carregar o kernel do Linux imagem na RAM

    
por PeterJ 28.09.2018 / 12:42

1 resposta

1

Is the kernel compiled from its C source code and how is the kernel actually executed.

Neste ponto, o código do kernel já está compilado e está em um formato que pode ser passado diretamente para o processador. As palavras arquivo de imagem compactado não se referem a uma imagem como um arquivo .JPG ou .GIF, mas uma imagem de memória - uma representação 1: 1 (após a descompactação) de o código de máquina real do kernel.

Em processadores mais antigos, os bytes de instrução reais eram alimentados apenas em uma matriz de hardware de portas lógicas dentro do processador chamado decodificador de instruções : ele habilitava outras portas a passar quaisquer bytes de dados instrução específica para qualquer parte do processador era necessária, e desencadear quaisquer outras ações necessárias. Nos processadores modernos, muitas vezes há mais um nível de controle de software: o microcódigo do processador.

When control is passed to the kernel how is this actually done?

Depende da arquitetura do firmware + do sistema. No BIOS x86 tradicional, o firmware e o bootloader são geralmente códigos de 16 bits que podem, em princípio, ser executados no primeiro IBM PC / AT: lá, o controle é passado essencialmente executando uma instrução de salto do código do carregador de inicialização para o código do kernel e nunca mais voltando.

As primeiras partes do código do kernel incluirão a rotina de descompactador que descompacta o resto do código do kernel, pega qualquer informação útil que o BIOS tenha deixado que seria sobrescrita, e muda o processador para 32 ou 64 bits. modo. Nesse processo, o código do gerenciador de inicialização na RAM pode ser sobrescrito e, assim, a ideia de retornar do código do kernel para o gerenciador de inicialização se tornará sem sentido.

Em PCs modernos com firmware UEFI, a especificação UEFI inclui um protocolo de transferência padrão entre o firmware / bootloader e o sistema operacional real, mas acaba sendo o processador executando uma instrução de salto para ir de um bloco de código (= parte do firmware / bootloader) para outro bloco (= a primeira parte do kernel) com a intenção de não voltar atrás.

    
por 28.09.2018 / 14:28