Après que le chargeur de démarrage a passé l'exécution au noyau, que se passe-t-il? Je connais l'assembleur, alors quelles sont les premières instructions qu'un noyau doit faire? Ou y a-t-il une fonction C qui fait cela? Quelle est la séquence de démarrage avant que le noyau puisse exécuter un binaire arbitraire?Quelles sont les premières opérations exécutées par Linux Kernel au démarrage?
Répondre
Je suppose que vous parlez x86 ici ...
Cela dépend où vous considérez comme la limite entre « chargeur de démarrage » et « noyau » d'être: le début du noyau proprement dite est 32 -bits en mode protégé, mais le noyau lui-même fournit du code de démarrage pour y accéder depuis le mode réel.
Le code en mode réel est en arch/x86/boot/
: start_of_setup
fait quelques réglages de base de l'environnement C, et appelle main()
, qui fait des choses assez terne, se terminant par le saut réel en mode protégé (voir pmjump.S
). Là où vous finissez maintenant dépend si le noyau est compressé ou non. Si c'est le cas, le point d'entrée est en fait une routine d'auto-décompression. C'est un truc plutôt terne, et essentiellement transparent: le code de décompression et le noyau compressé sont déplacés plus haut dans la mémoire, puis le noyau est décompressé à l'emplacement d'origine, puis il saute comme s'il n'avait pas été compressé. le long de. Ce code est dans arch/x86/boot/compressed/
(le point d'entrée est startup_32
dans head_32.S
). Le noyau fonctionne vraiment correctement à startup_32
dans arch/x86/kernel/head_32.S
. Le code y finit par appeler i386_start_kernel()
dans arch/x86/kernel/head32.c
, qui appelle finalement le code de démarrage du noyau générique dans start_kernel()
.
C'est asmlinkage void __init start_kernel(void)
Fonction C dans init/main.c
.
+1 Super réponse! Mais j'ai une question, qui appelle start_kernel()? – rook
Je pense que Matthew a déjà répondu à cette question. –
- 1. Voir les fichiers qui sont exécutés au démarrage (linux)
- 2. Linux Kernel Threads - scheduler
- 3. Multicasting + Linux Kernel
- 4. Linux redhat kernel-headers
- 5. Linux Kernel Modules: Quand utiliser try_module_get/module_put
- 6. Où sont exécutées les commandes Opengl?
- 7. Quelles sont les bonnes introductions en ligne aux tests et au développement piloté par les tests?
- 8. Existe-t-il un moyen de voir quelles commandes sont exécutées par TortoiseSVN?
- 9. Comment utiliser efficacement le répertoire Linux Kernel Documentation?
- 10. Quand les déclarations statiques sont-elles exécutées?
- 11. Quelles sont les premières étapes pour débuter avec Django/Python 2.7?
- 12. quelles sont les différences entre un fichier exécutable généré par Windows et Linux
- 13. Les fonctions du pilote ioctl sont-elles exécutées à partir d'un contexte atomique sous Linux 2.6?
- 14. Quelles sont les différences entre les délégués et les événements?
- 15. Quelles sont les difficultés du système d'exploitation multithreading?
- 16. Les applications Linux peuvent-elles être exécutées sous Android?
- 17. Quelles sont les opérations de threading bloquantes dans .NET qui gèrent les messages COM lorsqu'elles sont bloquées?
- 18. Android et Kernel-Modules
- 19. Quelles sont les valeurs prises par Camera.Parameters.set ("taille de l'image",?)?
- 20. Quelles sont les différences entre MySQL hébergé sur Windows et Debian (Linux)?
- 21. Linux futex 5.4 OS Kernel version 2.6.9 donnant des problèmes
- 22. compiler mon propre noyau (pas de source linux-kernel)
- 23. Android: SharedPreference: Les paramètres par défaut ne sont pas définis au démarrage
- 24. Quelles sont les instructions de Linq pour les entités?
- 25. Obtenir toutes les requêtes exécutées par django sur postgresql
- 26. Quelles bibliothèques de discours sont disponibles sous Linux?
- 27. construire un sk_buff pour le périphérique d'évacuation linux kernel
- 28. Chargeur de démarrage Linux
- 29. NT Kernel Programming
- 30. Quelles sont les opérations de base de données SQL "courantes" (nécessaires/utiles à connaître)?
Ceci est un K.O.! Comment l'avez-vous découvert? Y a-t-il un livre que je devrais lire? – rook
Expérience, vraiment: assez de familiarité avec la disposition de l'arborescence des sources du noyau pour savoir où chercher; et assez d'expérience avec le type d'amorçage du système d'exploitation (ayant déjà implémenté un code d'amorçage complexe à plusieurs étapes pour les systèmes embarqués), combiné à une certaine connaissance de l'amorçage x86, pour savoir ce qu'il faut rechercher. Je ne sais pas s'il y a un bon livre qui couvre ce domaine ou pas ... (Les détails des noyaux internes ont tendance à changer assez rapidement pour que les livres soient désuets assez rapidement!) –
http://www.makelinux.net/ kernel_map/ –