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,…