2010-04-07 6 views
23

Dopo che il caricatore di avvio ha eseguito l'esecuzione sul kernel, cosa succede? Conosco l'assemblatore, quindi quali sono le prime istruzioni che un kernel deve fare? O c'è una funzione C che fa questo? Qual è la sequenza di avvio prima che il kernel possa eseguire un binario arbitrario?Quali sono le prime operazioni che il Kernel Linux esegue all'avvio?

risposta

40

darò per scontato che tu stia parlando x86 qui ...

Dipende da dove si considera il confine tra "boot loader" e "kernel" di essere: l'inizio del kernel corretto è di 32 -bit codice in modalità protetta, ma il kernel stesso fornisce un codice di avvio per arrivare dalla modalità reale.

Il codice in modalità reale è in arch/x86/boot/: start_of_setup fa qualche configurazione di base dell'ambiente per la C, e chiama main(), che fa alcune cose piuttosto noiosa, che termina con il salto reale alla modalità protetta (vedi pmjump.S).

Dove si finisce ora dipende dal fatto che il kernel sia compresso o meno. Se lo è, il punto di ingresso è in realtà una routine di auto-decompressione. Anche questo è roba abbastanza noiosa, e sostanzialmente trasparente: il codice di decompressione e il kernel compresso vengono spostati più in alto nella memoria, quindi il kernel non è compresso nella posizione originale, quindi viene saltato dentro come se non fosse stato decompresso. lungo. Questo codice è arch/x86/boot/compressed/ (il punto di ingresso è startup_32 in head_32.S).

Il kernel funziona correttamente al numero startup_32 in arch/x86/kernel/head_32.S. Il codice finisce chiamando i386_start_kernel() in arch/x86/kernel/head32.c, che alla fine chiama il codice di avvio del kernel generico in start_kernel().

+1

Questo è un K.O.! Come l'hai scoperto? C'è un libro che dovrei leggere? – rook

+5

Esperienza, davvero: sufficiente familiarità con il layout dell'albero dei sorgenti del kernel per sapere dove guardare; e abbastanza esperienza con il tipo di cose che il bootstrap del sistema operativo coinvolge (avendo implementato un complesso codice di bootstrap multistadio per i sistemi embedded in passato), combinato con una certa conoscenza del boot x86, per sapere cosa cercare. Non so se ci sia un buon libro che copra quest'area o no ... (I dettagli degli interni del kernel tendono a cambiare abbastanza rapidamente che i libri vengono superati abbastanza velocemente!) –

+0

http://www.makelinux.net/ kernel_map/ –

Problemi correlati