Quais são os dois arquivos head.S na fonte Linux?

Quais são os dois arquivos head.S na fonte Linux?

Na fonte do Linux, existem dois arquivos head.S diferentes localizados em:

arco/braço/núcleo/cabeça.S

arco/braço/bota/comprimido/cabeça.S

Qual o propósito de cada um e qual a ordem de sua execução?

Responder1

Aceito respostas melhores, mas meu entendimento é que é o código de inicialização do kernel (que é específico da arquitetura) escrito à mão em assembly (lembre-se, neste ponto temos apenas uma CPU bare metal e acesso bruto à memória; não podemos acessar bibliotecas complexas armazenadas no sistema de arquivos porque ainda não temos um gerenciador de arquivos - é como perguntar quem criou o big bang). Não confunda isso com o carregador de boot (que carrega o setor de boot do disco para a RAM). Eu mesmo os confundi em minha resposta anterior.

             +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +     + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
             ' bootloader                                                                 '     ' kernel                                                                        '
             '                                                                            '     '                                                                               '
+------+     ' +-----------------------------------+     +------------------------------+ '     ' +-----------------------------+     +---------------------------------------+ '
| BIOS | --> ' | arch/x86/boot/header.S::call main | --> | arch/x86/boot/main.c::main() | ' --> ' | init/main.c::start_kernel() | --> | arch/x86/kernel/setup.c::setup_arch() | '
+------+     ' +-----------------------------------+     +------------------------------+ '     ' +-----------------------------+     +---------------------------------------+ '
             '                                                                            '     '                                                                               '
             +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +     + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

(EDITAR: este é o Minix, coloquei-o originalmente incorretamente)

+------+     +--------------------+     +------------------+     +------------------------+
| BIOS | --> | Bootloader (mbr.S) | --> | startup (head.S) | --> | kernel/main.c::kmain() |
+------+     +--------------------+     +------------------+     +------------------------+

insira a descrição da imagem aqui

No final de head.S você verá a linha

    call    _C_LABEL(kmain)

qual é o ponto de entrada para o kernel:

kernel/main.c

Acredito head.Sque esteja anexado ao topo da imagem do kernel em tempo de compilação. O BIOS sabe como executar esse bloco de código porque ele está no início e é o sistema de arquivos raiz do disco RAM.

Quanto ao motivo de haver uma parte compactada e descompactada, acho que é porque na parte de montagem específica da arquitetura da imagem do kernel, nenhum programador é qualificado o suficiente para fazer a compactação. Assim que pudermos pular para a kmainrotina escrita em C (mas compilada em assembly), teremos acesso a uma rotina de descompactação que torna o espaço do kernel significativamente menor.

insira a descrição da imagem aqui

http://duartes.org/gustavo/blog/post/kernel-boot-process/


O ponto de entrada usando assembly

Gostamos de escrever tudo em C, mas não podemos evitar um pouco de montagem. Escreveremos um pequeno arquivo em linguagem assembly x86 que servirá como ponto de partida para nosso kernel. Tudo o que nosso arquivo assembly fará é invocar uma função externa que escreveremos em C e então interromper o fluxo do programa.

Como podemos ter certeza de que esse código assembly servirá como ponto de partida do kernel?

Usaremos um script vinculador que vincula os arquivos objeto para produzir o executável final do kernel. (mais explicado posteriormente) Neste script de vinculador, especificaremos explicitamente que queremos que nosso binário seja carregado no endereço 0x100000. Este endereço, como eu disse anteriormente, é onde se espera que o kernel esteja. Assim, o bootloader se encarregará de disparar o ponto de entrada do kernel.

http://arjunsreedharan.org/post/82710718100/kernel-101-lets-write-a-kernel

informação relacionada