2013-05-01 16 views
7

Recentemente ho iniziato a studiare su Embedded System e Embedded Linux. So che in un sistema embedded, il sistema operativo è memorizzato su Flash o ROM. Quando è acceso, il bootloader carica il sistema operativo nella memoria principale, e con un Raspberry Pi, quel "flash o ROM" è una scheda SD.Come funziona il boot loader di Raspberry Pi?

Quindi, stavo cercando Raspberry Pi perché volevo iniziare a esercitarmi con uno, ed ero confuso dal concetto di "avvio" di un Raspberry Pi. La mia domanda è quale bootloader usa Raspberry Pi e come funziona? (Ovvero, quali processi si verificano prima del kernel? head.o? main.c? (Avvia kernel))

+0

Ben risposto qui: http: //raspberrypi.stackexchange.com/a/10490/34554 – opyate

+0

Sto votando per chiudere questa domanda come off-topic perché appartiene a http://raspberrypi.stackexchange.com ed è duplicata di (http://raspberrypi.stackexchange.com/questions/10489/come se-lampone-pi-boot) –

risposta

13

Questo processo è stato descritto a morte, non avresti dovuto avere problemi a trovarlo sulla rete.

Il raspberry pi contiene una GPU e un processore ARM, due processori separati. La GPU viene in primo luogo, presumo guidata da una ROM o hardware su chip che legge la scheda SD alla ricerca del primo file di avvio bootcode.bin. Quel bootloader GPU non è documentato per quanto ci riguarda, fa apparire il chip fino a un certo punto e quindi carica start.elf un altro programma GPU. Quel programma gpu finisce per far apparire il chip (ddr init) e alla fine carica kernel.img che è l'applicazione ARM (non bootloader del braccio ma applicazione come in linux), lo carica direttamente nella ram e fa ciò che un normale bootloader farebbe per preparare il braccio per avviare Linux (che in genere è quasi nulla) e poi gli stivali del braccio.

Un bootloader tradizionale si ha quando si ha un solo processore e questo è il processore che eseguirà anche l'applicazione/sistema operativo. nomi come redboot e uboot, ma questi sono diventati sistemi operativi grossolanamente complicati. ci vuole molto poco per fare il boot di Linux, mettere alcuni ATAG in RAM e impostare un paio di registri e questo è tutto (ovviamente dopo aver richiamato il sistema/ram, ecc. che non richiede troppo codice, ma è delecato/difficile codice per ddr per esempio), i nuovi linux hanno un po 'più roba da configurare ma non troppo.

L'avvio di raspberry pi è elegante nella sua semplicità così come la funzione di memoria non volatile rimovibile (la scheda SD), che riporta ai giorni del pre-bootloader in cui si inseriscono le rom e si cancellano , ha alcuni di quei dolori, ma ci sono modi per aggirare ciò. ormai ci sono probabilmente bootloader di terze parti complicati (uboot, ecc.) disponibili. Avere il flash rimovibile significa che non hai bisogno di un bootloader complcated, non devi preoccuparti di mettere il sistema in mattoni con un'applicazione rotta, puoi recuperarlo semplicemente rimuovendo il flash e cambiandolo. I bootloader sono cresciuti evitando di rimuovere il supporto per evitare di dissaldare un flash e resolder dopo aver programmato o utilizzato un socket su una scheda destinata ad avere una parte down saldata.

Il kernel.img così com'è ora (a un certo punto è stato caricato su 0x00000000) carica su 0x8000. E questo è tutto quello che devi sapere, è una normale immagine kernal che useresti con un bootloader. Puoi quindi scrivere qualsiasi cosa sia il metal o altro programma/applicazione che desideri, purché tu lo colleghi per l'indirizzo 0x8000 come inizio del binario e il punto di partenza. Se si desidera utilizzare le eccezioni è necessario quindi scrivere la tabella delle eccezioni in qualche modo (ci sono vari modi per farlo). Un'alternativa a questa è l'impostazione della modalità legacy è possibile utilizzare un file config.txt facoltativo da configurare e che caricherà il kernel.img a 0x0000 come i primi giorni dell'rpi. Personalmente vado con il default 0x8000, altre persone in metallo prendono l'altro percorso ...

Ho un bootloader xmodem molto semplice e uno che imposta i pin jtag in modo da poter usare jtag (entrambi i casi per evitare di avere per fare la scheda SD danza centinaia o migliaia di volte mentre sviluppi la tua applicazione). Ce ne sono altri, altri più complicati, forse persino uno che ha la usb fino al punto in cui funziona la rete.