Raspberry Pi e o processo de boot

- por Sergio Prado

Categorias: Raspberry Pi Tags: , , , , ,

Uma das primeiras coisas que você precisa fazer quando começar a trabalhar com uma nova plataforma de hardware é entender o seu processo de boot.

E o processo de boot da Raspberry Pi é um pouco diferente comparado às outras plataformas comuns que rodam Linux como a Beagleboard, Beaglebone ou i.MX53. A começar pelo hardware…

Quando você energiza o SoC da Broadcom (BCM2835), quem assume o controle não é a CPU (ARM1176JZ-F), mas sim a GPU, responsável pelo processamento gráfico do chip! Sim, caros leitores. Ao ser energizada, o processador principal da placa é a GPU, e o co-processador é o ARM11, que fica ali, paradinho, esperando sua vez para entrar na brincadeira.

Outra diferença é que a Raspberry Pi (pelo menos por enquanto) não usa o U-Boot como bootloader padrão para carregar e executar o kernel Linux. Mas vamos começar pelo começo…

O PRIMEIRO ELÉTRON

Conforme descrevi mais acima, ao energizar a Raspberry Pi, quem assume o controle da placa é o core da GPU. E o primeiro código a ser executado esta armazenado em ROM, dentro do SoC, inacessível a nós, meros mortais que não trabalhamos na Broadcom.

Este código é responsável por procurar um código de boot em algumas interfaces de armazenamento, carregar este código para uma memória interna (cache L2 do SoC para ser mais preciso) e executar. E que tipos de interfaces de armazenamento o SoC reconhece como dispositivo de boot? Não dá para saber, já que não temos o datasheet do SoC. Temos disponível apenas uma parte do datasheet, que descreve o acesso aos periféricos do SoC, mas que não descreve o processo de boot (este documento pode ser acessado aqui). Mas se você quiser o datasheet do BCM2835 é fácil, é só assinar um NDA com a Broadcom…:)

Voltando ao processo de boot, o que sabemos é que o SoC procura na primeira partição do cartão SD um arquivo chamado bootcode.bin. Esta partição do cartão SD precisa estar formatada com FAT32, e o bootcode.bin é um código compilado para ser executado na GPU. Sim, você adivinhou, não temos os fontes deste bootloader de primeiro estágio… :(

Resumindo a primeira etapa de boot: você liga a Raspberry Pi, a GPU assume, procura o arquivo bootcode.bin na primeira partição do cartão SD, carrega para a memória cache L2 e executa.

Mas o que então faz este bootcode.bin?

O SEGUNDO ESTÁGIO

O bootcode.bin tem duas responsabilidades principais: inicializar a SDRAM e carregar um bootloader de segundo estágio para ela. Este bootloader de segundo estágio é um arquivo chamado start.elf que também deve estar na primeira partição do cartão SD.

O start.elf também é um binário compilado para ser executado na GPU, e com a ajuda de um outro binário chamado fixup.dat, também possui duas responsabilidades principais: configurar o hardware de acordo com um arquivo de configuração e carregar o kernel Linux.

O arquivo de configuração é chamado config.txt, e também deve estar na primeira partição do cartão SD. Neste arquivo de configuração você pode configurar o hardware, definir mapeamento de memória, especificar parâmetros para carregar o kernel Linux, etc. Uma especificação completa do arquivo encontra-se aqui.

Após ler o arquivo de configuração, ele irá carregar o arquivo kernel.img, que também deve estar na primeira partição do cartão SD. Esse arquivo nada mais é do que a imagem do kernel Linux. Antes de executar a imagem do kernel, ele é capaz de passar a linha de comandos para o kernel, que pode ser definida no arquivo cmdline.txt, ou em uma variável no arquivo config.txt.

Resumo da ópera: você energiza a placa, a GPU assume, carrega o bootcode.bin para a memória cache L2 e executa. O bootcode.bin inicializa a SDRAM, carrega o start.elf para a RAM externa e executa. O start.elf configura o hardware de acordo com o arquivo config.txt, carrega a imagem do kernel em kernel.img, lê a linha de comandos do kernel no cmdline.txt, e dá vida ao pinguim mais famoso do universo. Todos estes arquivos devem estar na primeira partição do cartão SD, que deve estar formatado com FAT32:

$ ls /media/raspberrypi
bootcode.bin  cmdline.txt  config.txt  fixup.dat  kernel.img  start.elf

Obs: Em uma versão mais antiga do firmware de boot, existia um passo adicional. Em vez do bootcode.bin carregar diretamente o start.elf, ele carregava o loader.bin, e este era o responsável por carregar o start.elf. Este passo adicional foi removido nas versões mais novas do firmware do boot.

O FIRMWARE

Todo o firmware descrito aqui, com exceção da imagem do kernel (kernel.img) pode ser baixado no repositório oficial do projeto no github em https://github.com/raspberrypi/firmware. Mas nada de fontes, você só vai encontrar neste projeto os binários e alguma documentação, o suficiente para você carregar e executar o seu sistema Linux na Raspberry Pi.

No próximo artigo vamos construir um sistema Linux do zero para a Raspberry Pi. Até lá!

Um abraço,

Sergio Prado

  • Henrique Ribeiro

    Muito bom o seu post. Estou aguardando ansiosamente para o próximo onde você mostrará como montar um Linux do zero. Meu Raspberry está aguardando. hehehe

  • Henrique

    Muito interessante. Isso aguçou o meu interesse.
    Muito gentil da sua parte compartilhar tal conhecimento.

  • Ronaldo Araujo

    Parabéns pelo post … Não vejo a hora da continuação do assunto …

  • Fellipe Henrique

    Muito bom.. a espera do próximo post….

  • Humberto

    Muito bom a explanação. Aguardo seu próximo post para começar a “mexer” no meu  Raspberry.

  • Mario Felipe

    De mais seu artigo!! Simples de entende e ao longo do texto vai adicionando links adicionais.

  • joaogauer

    Estou tentando instalar o Debian disponibilizado no site oficial, sigo todos os passos exatamente como explicado no guide, quando ligo nada acontece.

    • Publica aqui todos os passos que está executando no terminal, com a saída dos comandos para que eu possa ajudá-lo.

  • Weslly S. Lages

    Amigo boa noite, meu Raspberry Pi 2 não da video. Quando ligo PI ele fica com os LED acesos (UM VERDE e OUTRO VERMELHO)… O que eu faço amigo ?

  • silvio

    comprei eu raspberry pi 3 gostaria de criar uma maq. virtual para instalar Wind. xp, mas não estou conseguindo essa instalação, usei o qemu, para fazer isso mas apenas abre o qemu mas não prossegue, alguém já fez algo assim?

    • Olá Silvio,

      Você quer emular o Windows XP dentro da Raspberry Pi 3?

  • Julio_Oliveira

    Bom dia…comprei um Rasp PI3…. Já tentei instalar o Raspbian via NOOBS e também via arquivo de imagem 2016-09-23-raspbian-jessie-lite. Baixei o FDFormatter para formatar a memoria de 32 GB classe 10, e tambem o Win32DiskImager para transferir a imagem para o cartão.
    Após transferir os arquivos desconpactados do NOOBS para o cartão e ligar o Rasp, aparece a mensagem de ERROR MOUNTING FILE SYSTEM, sempre neste mesmo local ==>RASPBIAN: Creating filesystem(ext4),e sempre após ter carregado 20 MB de 3537…
    Já quando ligo o Rasp com a imagem 2016-09-23-raspbian-jessie-lite abre o prompt do Linux, Estarta varios itens (aplicativos?), porém não carrega o sistema operacional. Fica somente no prompt do Linux pi@raspberrypi: ~$.
    Como sou novo na area, gostaria de saber se estou fazendo algo errado ou pode ser problema da placa Rasp?

    • Olá Julio,

      O comportamento da imagem 2016-09-23-raspbian-jessie-lite está correto. Esta imagem não tem suporte à interface gráfica, então o boot vai parar mesmo no terminal de comandos.

      Já no primeiro caso você deve estar com algum problema ou na imagem que baixou, os nos programas de gravação do Windows.

      Como nunca utilizei estes programas e nunca tive este problema, infelizmente não sei como ajudá-lo. Tente baixar direto o RASPBIAN JESSIE WITH PIXEL e testar.

      Um abraço!

  • Claudio Ramos

    Sergio parabens pelo blog!
    Cara estou com um probleminha apos uma atualização no meu rasp pi3, é que, anteriormente a parte grafica do sistema subia no meu display tft 3.5′ porem agora só aparece o prompt de comando aguardando algum comando como se não tivesse a parte grafica do mesmo. Porem o interessante é se eu acessar ele via vnc aparece no meu computador a parte grafica do sistema normalmente e todos os acessos, acho que deve ser alguma configuração ! e não quero reinstalar só por causa disso pois tenho muita coisa util nele que ja fiz e meu backup esta desatualizado, porem ja fiz um teste com iso do backup e funciona normalmente ou seja o sistema sobe o grafico no display, vc consegue me ajudar ou da uma luz …? valeu

  • Allyson Pereira

    Olá Sergio, tudo bem por ai?
    Não estou certo que você vai ler esse meu comentário pois este post é bem antigo, mas o farei mesmo assim.

    Estou trabalhando num projeto particular usando a Raspberry PI 2 mas estou com um problema grave. O cartão SD corrompe com muita facilidade.

    Nos seus testes você já teve esse problema? E ai, como resolver?

    Um grande abraço,

    • Olá Allyson, como vai?

      O cartão SD se corrompe de que forma? Você está escrevendo frequentemente no cartão SD? Está utilizando um modelo de boa qualidade?

  • Rodrigo Pereira

    Amigo gostaria de saber pq o software que roda no raspberry pi 2 não roda na raspberry pi 3?
    Qual a alteração deveria ser feita pra raspberry pi 3 executar o boot?

  • Protagonist.

    Sérgio, o que é necessário fazer para que o sistema (Raspbian) volte a ser bootado depois de fazer um backward update no kernel (estou saindo de 4.4 para 3.18) usando o comando rpi -update?

    • Protagonist.

      Eu não fiz o update ainda, só fiquei sabendo que não há boot? Posso fazer o update de forma tranquila?

    • Protagonist.

      Uso Raspberry Pi 3 Model B.

    • Boa pergunta. Nunca fiz isso. Talvez seja melhor você perguntar no fórum da Raspberry Pi.

  • Lucas Silva

    boa tarde amigo, eu gostaria de saber como posso colocar mais um boot na minha raspberry, tipo, hoje no meu cartao sd tenho o librelec e o raspibian, feito o boot pelo noobs, onde escoli os sistemas, mas la nao tem o instalador da retropie que uso em outro cartao sd.
    gostaria de poder ter os tres sistemas no mesmo cartao.
    Tem como vc me ajudar

Navegue
Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.