Olhando os arquivos de origem, onde o Linux começa a executar?

7

Gostaria de ler um pouco do código fonte para tentar entender como tudo se encaixa, mas não consegue ver por onde começar. Qual arquivo no código-fonte do Linux é o arquivo principal usado para compilar o kernel?

Eu estava esperando encontrar um kernel/main.c , mas há muitos arquivos em kernel/ e não consigo ver qual deles é o principal? É kernel/sys.c ?

    
por neelsg 28.08.2014 / 15:01

2 respostas

9

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

    
por 28.08.2014 / 16:51
3

Tente ver start_kernel() em /init/main.c . Esta é a função que é chamada pelo gerenciador de inicialização após ter configurado alguns recursos básicos, como paginação de memória.

Para mais contexto: processo de inicialização do wikipedia Linux .

    
por 28.08.2014 / 15:26

Tags