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. –
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/ –