Uma parte da pergunta que ainda não foi respondida é a diferença entre os gerenciadores de inicialização nos microcontroladores e nos sistemas de microprocessadores.
Microcontrolador
A maioria dos microcontroladores possui memória ROM incorporada que contém o código do programa. A alteração desse código geralmente requer um dispositivo programador que se conecte à interface de programação do microcontrolador (por exemplo, ISP no ATMega). Mas essas interfaces de programação geralmente não são muito convenientes de usar, em comparação com outras interfaces, pois podem não estar prontamente disponíveis no contexto especificado. Por exemplo, enquanto quase todos os computadores possuem portas USB, a interface SPI necessária para o ISP é muito mais rara, e outras interfaces, como a interface PID usada no ATXMega, são suportadas apenas por hardware de programação dedicado.
Portanto, por exemplo, se você deseja atualizar o software de um computador comum sem nenhum hardware externo, pode usar um carregador de inicialização que lê de um tipo diferente de interface (por exemplo, RS232, USB ou RS232 através de USB como no Arduino) para programar o dispositivo sobre interfaces comuns.
Dito isto, se você não precisar dessa funcionalidade, o gerenciador de inicialização é completamente opcional. O microcontrolador ainda pode executar seu código completamente sem o gerenciador de inicialização.
Microprocessador
Em um microprocessador, as coisas são um pouco diferentes. Enquanto a maioria dos microprocessadores possui uma ROM grande o suficiente para um carregador de inicialização, essas ROMs não são grandes o suficiente para suportar um sistema operacional completo. Portanto, o objetivo do carregador de inicialização é inicializar o hardware, procurar um sistema operacional inicializável, carregá-lo e executá-lo. Portanto, o carregador de inicialização é essencial para cada inicialização.
Nos sistemas x86 / x64, esse carregador de inicialização é o BIOS ou o UEFI (basicamente uma versão mais recente de um BIOS).
Às vezes você pode até ter vários gerenciadores de inicialização executando em uma cadeia. Por exemplo, se você possui um sistema de inicialização dupla com Windows e Linux, pode acabar com o seguinte:
- O BIOS / UEFI é inicializado e encontra o GRUB instalado. Em seguida, ele carrega o GRUB (= Grand Unified Bootloader)
- O GRUB encontra algum tipo de Linux e o Windows Bootloader. O usuário seleciona o Windows Bootloader.
- O carregador de inicialização do Windows é iniciado e encontra o Windows 7 e o Windows 10 instalados. O usuário seleciona o Windows 10.
- Finalmente o Windows 10 é inicializado.
Portanto, neste caso, havia três softwares que podem ser considerados um gerenciador de inicialização. O GRUB e o Windows Bootloader estão disponíveis para oferecer ao usuário uma opção de seleção de inicialização mais conveniente do que a BIOS / UEFI daria a eles. Ele também permite o lançamento de vários sistemas operacionais a partir do mesmo disco rígido ou até da mesma partição.
TLDR
Portanto, enquanto nos dois sistemas o gerenciador de inicialização faz coisas semelhantes (ajudando o usuário a escolher qual código inicializar), ambos diferem bastante na maneira como realizam isso e no que fazem exatamente.