# Carregador de inicialização

Um carregador de inicialização (também chamado de bootloader, boot loader ou bootstrap loader) é um programa de computador que é responsável por inicializar um computador e inicializar um sistema operacional. Se ele também fornece um menu interativo com várias opções de inicialização, então é frequentemente chamado de gerenciador de inicialização.
Quando um computador é desligado, seu softwar (incluindo sistemas operacionais, códigos de aplicativos e dados) permanece armazenado na memória que não é volátil. Quando o computador é ligado, ele normalmente não tem um sistema operacional ou seu carregador na memória de acesso aleatório (RAM). O computador primeiro executa um programa relativamente pequeno armazenado na ROM de inicialização, que é memória somente de leitura (ROM e, mais tarde, EEPROM, NOR flash) junto com alguns dados necessários, para inicializar dispositivos de hardware como CPU, placa-mãe, memória, armazenamento e outros dispositivos de E/S, para acessar o dispositivo não volátil (geralmente dispositivo de bloco, por exemplo, NAND flash) ou dispositivos dos quais os programas e dados do sistema operacional podem ser carregados na memória de acesso aleatório.
Alguns sistemas de computador mais antigos, ao receber um sinal de inicialização de um operador humano ou de um dispositivo periférico, podem carregar um número muito pequeno de instruções fixas na memória em um local específico, inicializar pelo menos uma CPU e, em seguida, apontar a CPU para as instruções e iniciar sua execução. Essas instruções normalmente iniciam uma operação de entrada de algum dispositivo periférico (que pode ser selecionável por chave pelo operador). Outros sistemas podem enviar comandos de hardware diretamente para dispositivos periféricos ou controladores de E/S que causam uma operação de entrada extremamente simples (como "ler o setor zero do dispositivo do sistema na memória começando no local 1000") a ser realizada, efetivamente carregando um pequeno número de instruções do carregador de inicialização na memória; um sinal de conclusão do dispositivo de E/S pode então ser usado para iniciar a execução das instruções pela CPU.
Computadores menores geralmente usam mecanismos de inicialização menos flexíveis, mas mais automáticos, para garantir que o computador inicie rapidamente e com uma configuração de software predeterminada. Em muitos computadores de mesa, por exemplo, o processo de inicialização começa com a CPU executando o software contido na ROM (por exemplo, o BIOS de um IBM PC ou um compatível com IBM PC) em um endereço predefinido (algumas CPUs, incluindo a série Intel x86, são projetadas para executar este software após a reinicialização, sem ajuda externa). Este software contém funcionalidade rudimentar para procurar dispositivos qualificados para participar da inicialização e carregar um pequeno programa de uma seção especial (mais comumente o setor de inicialização) do dispositivo mais promissor, normalmente começando em um ponto de entrada fixo, como o início do setor.

## Carregador de inicialização de primeiro estágio

Exemplos de carregadores de inicialização de primeiro estágio incluem BIOS, UEFI, coreboot, Libreboot e Das U-Boot. Ele inicializa dispositivos de hardware como CPU, placa-mãe, memória, armazenamento e outros dispositivos de E/S.

## Carregador de inicialização de segundo estágio

Carregadores de inicialização de segundo estágio, como GNU GRUB, rEFInd, BOOTMGR, Syslinux e NTLDR, não são sistemas operacionais propriamente ditos, mas são capazes de carregar um sistema operacional adequadamente e transferir a execução para ele; o sistema operacional subsequentemente se inicializa e pode carregar drivers de dispositivo extras.
Implementações de segundo estágio podem incluir interfaces de usuário interativas, permitindo a seleção de opções de inicialização e modificação de parâmetros. Eles lidam com o carregamento do núcleo, incluindo o processamento de imagens initrd/initramfs, e podem passar parâmetros de inicialização para o núcleo. Muitos implementam designs modulares que suportam módulos carregáveis para funcionalidade adicional. Essas escolhas podem incluir diferentes sistemas operacionais (para inicialização dupla ou múltipla de diferentes partições ou unidades), diferentes versões do mesmo sistema operacional (no caso de uma nova versão ter problemas inesperados), diferentes opções de carregamento do sistema operacional (por exemplo, inicialização em um modo de resgate ou seguro) e alguns programas autônomos que podem funcionar sem um sistema operacional, como testadores de memória (por exemplo, memtest86+), um shell básico (como no GNU GRUB) ou até mesmo jogos. Alguns carregadores de inicialização também podem carregar outros carregadores de inicialização; por exemplo, o GRUB carrega o BOOTMGR em vez de carregar o Windows diretamente. Normalmente, uma escolha padrão é pré-selecionada com um atraso de tempo durante o qual um usuário pode pressionar uma tecla para alterar a escolha; após esse atraso, a escolha padrão é executada automaticamente para que a inicialização normal possa ocorrer sem interação. Eles também podem lidar com compactação, verificação criptográfica e carregamento sequencial de outros carregadores de inicialização. O processo de inicialização pode ser considerado completo quando o computador estiver pronto para interagir com o usuário ou o sistema operacional for capaz de executar programas de sistema ou programas de aplicativos.

## Computadores pessoais compatíveis com IBM
### BIOS de legado

Em computadores x86, depois que o BIOS executa o autoteste de inicialização (POST), um carregador de inicialização de primeiro estágio que é um programa compacto de 512 bytes que reside no registro mestre de inicialização (MBR) é executado. Executando em modo real de 16 bits no endereço 0x7C00, ele localiza o carregador de inicialização de segundo estágio. Seu principal desafio está em realizar essas tarefas dentro de restrições de tamanho rígidas enquanto lida com potenciais falhas de hardware. O carregador de inicialização deve navegar pelas estruturas de disco, frequentemente implementando suporte ao sistema de arquivos FAT, e gerenciar a delicada transição do estado de inicialização do BIOS para um ambiente estável para o próximo estágio de inicialização.
Os carregadores de inicialização de MBR de primeiro estágio podem enfrentar restrições peculiares, especialmente em tamanho; por exemplo, no IBM PC anterior e compatíveis, um setor de inicialização normalmente deve funcionar com 510 bytes de código (ou menos) e em apenas 32 KiB (posteriormente relaxado para 64 KiB) de memória do sistema e usar apenas instruções suportadas pelos processadores 8088/8086 originais. O primeiro estágio dos carregadores de inicialização de PC (FSBL) localizados em discos fixos e unidades removíveis deve caber nos primeiros 446 bytes do registro mestre de inicialização para deixar espaço para a tabela de partição padrão de 64 bytes com quatro entradas de partição e a assinatura de inicialização de dois bytes, que o BIOS requer para um carregador de inicialização adequado — ou até menos, quando recursos adicionais como mais de quatro entradas de partição (até 16 com 16 bytes cada), uma assinatura de disco (6 bytes), um registro de data e hora do disco (6 bytes), uma partição ativa avançada (18 bytes) ou carregadores de inicialização múltipla especiais também precisam ser suportados em alguns ambientes.
Em registros de inicialização de volumes de disquetes e superdisquetes, até 59 bytes são ocupados para o bloco de parâmetros do BIOS estendido (EBPB) em volumes FAT12 e FAT16 desde o DOS 4.0, enquanto o EBPB do FAT32 introduzido com o DOS 7.1 requer até 87 bytes, deixando apenas 423 bytes para o carregador de inicialização ao assumir um tamanho de setor de 512 bytes. Os setores de inicialização da Microsoft, portanto, tradicionalmente impunham certas restrições ao processo de inicialização. Por exemplo, o arquivo de inicialização tinha que estar localizado em uma posição fixa no diretório raiz do sistema de arquivos e armazenado em setores consecutivos, condições atendidas pelo comando SYS e ligeiramente relaxadas em versões posteriores do DOS. O carregador de inicialização foi então capaz de carregar os três primeiros setores do arquivo na memória, que por acaso continha outro carregador de inicialização incorporado capaz de carregar o restante do arquivo na memória. Quando a Microsoft adicionou o endereçamento de bloco lógico (LBA) e o suporte a FAT32, eles mudaram para um carregador de inicialização alcançando mais de dois setores físicos, usando 386 instruções por razões de tamanho. Ao mesmo tempo, outros fornecedores conseguiram espremer muito mais funcionalidade em um único setor de inicialização sem relaxar as restrições originais em apenas memória mínima disponível (32 KiB) e suporte ao processador (8088/8086). Por exemplo, os setores de inicialização do DR-DOS são capazes de localizar o arquivo de inicialização nos sistemas de arquivos FAT12, FAT16 e FAT32 e carregá-lo na memória como um todo via CHS ou LBA, mesmo se o arquivo não estiver armazenado em um local fixo e em setores consecutivos.
Em computadores x86, os carregadores de inicialização de segundo estágio, como o registro de inicialização da partição (PBR), operam sem a limitação estrita de 512 bytes de seus equivalentes de primeiro estágio. Eles são executados em um ambiente mais sofisticado, geralmente variando de 8 KB a vários megabytes de tamanho. Esse espaço expandido permite a implementação de recursos complexos, como suporte ao sistema de arquivos, configuração de tempo de execução e interfaces de menu do carregador de inicialização. O carregador de inicialização de segundo estágio não precisa de drivers para sua própria operação, mas pode usar métodos genéricos de acesso ao armazenamento fornecidos pelo firmware do sistema, como o BIOS, embora normalmente com funcionalidade de hardware restrita e desempenho inferior.
Em computadores x86, os carregadores de inicialização de terceiro estágio incluem IO.SYS, NTLDR, BOOTMGR e GRUB.

### UEFI

A UEFI (exceto para inicialização em CSM) não depende de setores de inicialização, ela carrega o carregador de inicialização de próximo estágio (como o BOOTMGR e o GRUB2) diretamente a partir da partição de sistema da EFI.

## Carregadores de inicialização integrados e de vários estágios

Muitos sistemas embarcados devem inicializar imediatamente. Por exemplo, esperar um minuto para que uma televisão digital ou um dispositivo de navegação GPS inicie é geralmente inaceitável. Portanto, esses dispositivos têm sistemas de software em ROM ou memória flash para que o dispositivo possa começar a funcionar imediatamente; pouco ou nenhum carregamento é necessário, porque o carregamento pode ser pré-computado e armazenado na ROM quando o dispositivo é feito.
Sistemas grandes e complexos podem ter procedimentos de inicialização que prosseguem em várias fases até que finalmente o sistema operacional e outros programas sejam carregados e estejam prontos para execução. Como os sistemas operacionais são projetados como se nunca iniciassem ou parassem, um carregador de inicialização pode carregar o sistema operacional, configurar-se como um mero processo dentro desse sistema e, em seguida, transferir irrevogavelmente o controle para o sistema operacional. O carregador de inicialização então termina normalmente como qualquer outro processo faria.

## Inicialização de rede

A maioria dos computadores também é capaz de inicializar por uma rede de computadores. Neste cenário, o sistema operacional é armazenado no disco de um servidor, e certas partes dele são transferidas para o cliente usando um protocolo simples, como o Protocolo de Transferência De Arquivos Trivial (TFTP). Após essas partes terem sido transferidas, o sistema operacional assume o controle do processo de inicialização.
Assim como no carregador de inicialização de segundo estágio, a inicialização de rede começa usando métodos genéricos de acesso à rede fornecidos pela ROM de inicialização da interface de rede, que normalmente contém uma imagem do ambiente de execução de pré-inicialização (PXE). Nenhum driver é necessário, mas a funcionalidade do sistema é limitada até que o núcleo e os drivers do sistema operacional sejam transferidos e iniciados. Como resultado, uma vez que a inicialização baseada em ROM tenha sido concluída, é totalmente possível inicializar a rede em um sistema operacional que não tem a capacidade de usar a interface de rede.