A transferência do carregador de inicialização para o kernel envolve necessariamente algumas considerações específicas da arquitetura, como endereços de memória e uso de registro. Consequentemente, o lugar para procurar está nos diretórios específicos da arquitetura ( arch/* ). Além disso, o handover do bootloader envolve um protocolo de uso de registro preciso que provavelmente será implementado no assembler. O kernel tem até pontos de entrada diferentes para diferentes gerenciadores de inicialização em algumas arquiteturas.
Por exemplo, no x86, o ponto de entrada está em arch/x86/boot/header.S (não sei de outros pontos de entrada, mas não tenho certeza de que não haja nenhum). O verdadeiro ponto de entrada é o rótulo _start no deslocamento 512 em o binário . Os 512 bytes anteriores podem ser usados para fazer um registro mestre de inicialização para um BIOS compatível com PC IBM (antigamente , um kernel pode inicializar dessa maneira, mas agora esta parte exibe apenas uma mensagem de erro). O rótulo _start inicia um processamento bastante longo, no modo real , primeiro na montagem e então em main.c . Em algum momento, o código de inicialização alterna para o modo protegido . Eu acho que este é o ponto onde a descompressão acontece se o kernel é comprimido ; então o controle alcança startup_32 ou startup_64 em arch/x86/kernel/head_*.S dependendo se este é um Kernel de 32 ou 64 bits. Após mais montagens, i386_start_kernel in head32.c ou x86_64_start_kernel in head64.c é invocado. Por fim, é invocada a start_kernel função independente de arquitetura em init/main.c . / p>
start_kernel é onde o kernel começa a se preparar para o mundo real. Quando ele inicia, há apenas uma única CPU e alguma memória (com memória virtual, a MMU já está ativada nesse ponto). O código lá configura mappins de memória, inicializa todos os subsistemas, configura manipuladores de interrupção, inicia o agendador para que os threads possam ser criados, inicie a interação com os periféricos, etc.
O kernel tem outros pontos de entrada além do carregador de inicialização: pontos de entrada ao ativar um núcleo em uma CPU com vários núcleos, manipuladores de interrupção, manipuladores de chamada do sistema, manipuladores de falhas,…