Pergunta

Eu estou escrevendo um carregador de inicialização, e eu tenho a maioria dos detalhes para baixo, mas eu não tenho certeza por que alguns carregadores de inicialização-se mudar na memória antes de começar o grosso da sua execução.

Alguém pode explicar isso?

Um exemplo deste comportamento é o originais v0.01 kernel Linux bootloader que tem o seguinte comentário na mesma:

boot.s é carregado no 0x7c00 pelas rotinas de bios-inicialização e se move para fora do caminho para o endereço 0x90000 e salta lá.

Foi útil?

Solução

A partir do artigo ligado:

Na prática, o MBR geralmente contém um carregador de inicialização cujo objetivo é carregar outro carregador de inicialização - pode ser encontrada no início de uma das partições. Isso é muitas vezes um programa muito simples que encontra a primeira partição marcada Ativo, carrega o primeiro setor na RAM, e inicia sua execução. Desde por convenção o novo gerenciador de inicialização também é carregado para 7C00h endereço, o antigo carregador pode precisar de mudar toda ou parte de si mesmo para um local diferente antes de fazer isso. Além disso, ES: SI está prevista para conter o endereço na RAM da tabela de partição, e DL o número de unidade de arranque. Quebrar essas convenções podem tornar um incompatível bootloader com outros bootloaders.

Outras dicas

CookieOfFortune é essencialmente correta (Porque ele queria mudar algo no lugar onde o bootloader inicial era), mas não foi por um segundo bootloader, mas sim o próprio kernel.

A partir de suas observações:

Em seguida, carrega o sistema em 0x10000, usando interrupções de BIOS. Depois disso desactiva todas as interrupções, move o sistema de baixo para 0x0000, muda para modo protegido, e chama o início da sistema. Sistema, então deve RE-inicializar o modo protegido no é próprios quadros, e permitir interrupções, conforme necessário.

Ele quer que o kernel para ser localizado em 0x0000 ... 0xKERNEL_SIZE-1, no entanto, o bootloader inicial está atualmente em 0x7C00, por isso, se o kernel foi mais ~ 32 KB que iria substituir o bootloader como foi movê-lo. O fato de que o kernel está localizado na 0x0000 também explica este comentário:

"NOTA! Actualmente sistema é, no máximo, 8 * 65536 bytes. "

Se fosse qualquer mais de 512 KB a partir de 0 seria correr o risco de bater a área reservada do espaço de endereço x86.

Eu acredito que esta seção de código contém o salto real no kernel

mov ax,#0x0001  | protected mode (PE) bit
lmsw    ax      | This is it!
jmpi    0,8     | jmp offset 0 of segment 8 (cs)

Às vezes o bootloader está em ROM, e precisa ser copiado para a RAM em algum ponto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top