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
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()
.
È la funzione asmlinkage void __init start_kernel(void)
C in init/main.c
.
+1 Risposta impressionante! Ma ho una domanda, chi chiama start_kernel()? – rook
Penso che Matthew abbia già risposto. –
- 1. Quali strutture dati sono disponibili nel kernel Linux
- 2. Quali sono alcune operazioni che richiedono molto tempo in C?
- 3. Quali sono le cose buone e cattive nella progettazione del kernel Linux?
- 4. Quali sono le operazioni banali in std :: is_trivially_copy_constructible in C++
- 5. Quali sono le buone distribuzioni (e metodi) di Linux per lo sviluppo degli ultimi pacchetti Linux upstream (kernel, Gnome, ecc.)?
- 6. Quali operazioni nel nodo sono thread-safe?
- 7. Quali operazioni sono economiche/costose in mongodb?
- 8. Quali parti del kernel Linux posso leggere per divertimento?
- 9. Sviluppatore incorporato, quali sono le competenze importanti
- 10. Kernel Linux Invalidazione voci TLB
- 11. Quali sono le trasformazioni Spark che causano uno Shuffle?
- 12. Strumento che mi mostra quali file sono scritti in Linux?
- 13. Quali sono alcune condizioni che possono causare il fallimento di chiamate fork() o system() su Linux?
- 14. In che modo linux-kernel legge il file proc/pid?
- 15. Quali sono le migliori pratiche per le librerie di classi che utilizzano l'integrazione delle dipendenze per le operazioni interne?
- 16. Quali operazioni Git bloccano il database?
- 17. Quali sono le fortune?
- 18. Visualizza le opzioni di configurazione del kernel Linux
- 19. Operazioni atomiche in C su Linux
- 20. Le operazioni logiche su più operazioni modulo sono ottimizzate?
- 21. Restrizioni mentre il kernel esegue una routine ISR
- 22. Quali sono le librerie che collegano le opzioni in Xcode?
- 23. Quali forum Linux/embedded Linux attivi sono disponibili online?
- 24. Compilare il modulo kernel linux (2.6) incluse le intestazioni non kernel
- 25. In che modo Linux esegue un file?
- 26. Chiamate di sistema Linux e modalità kernel
- 27. Come configurare il kernel Linux in Buildroot?
- 28. quali fusibili versione nel mio kernel?
- 29. Quali operazioni sulle collezioni parallele Scala sono parallelizzate?
- 30. Perché il kernel di Linux usa le strutture dati che fa?
Questo è un K.O.! Come l'hai scoperto? C'è un libro che dovrei leggere? – rook
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!) –
http://www.makelinux.net/ kernel_map/ –