Comment un noyau Linux est-il capable d'accéder à ses initramfs / initrd assignés?


8

J'essaie de comprendre le processus de démarrage d'une machine dans son ensemble à partir du moment où vous appuyez sur le bouton d'alimentation. Il y a ce morceau du chargeur de démarrage à l'étape initramfs que je ne comprends pas très bien parmi d'autres petits bits.

Compte tenu de cette configuration Grub pour une entrée, tirée d'une récente installation par défaut d'Ubuntu:

insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 96fb7310-5adb-4f66-bf59-04acd08d76a3
echo    'Loading Linux x.y.z ...'
linux   /vmlinuz-x.y.z root=/dev/mapper/some-device-name ro nomodeset 
echo    'Loading initial ramdisk ...'
initrd  /initrd.img-x.y.z

Qu'est-ce que cela fait réellement en termes d'état du système et de mémoire? Je comprends que la tâche de Grub est de "charger et exécuter le noyau" et qu'il possède son propre ensemble de modules pour accéder aux fichiers sur les périphériques (ou réseau) pour y accéder. Dans l'exemple ici insmods, set rootet search- mais c'est juste du point de vue de Grub, et non partagé avec le noyau, non?

Je suppose également que Grub charge (une copie?) Du noyau dans la mémoire ( linuxcommande ) et le lance pour démarrer l'exécution. (deux étapes différentes apparemment - alors, comment?) Les paramètres donnés peuvent être lus dans le noyau et interprétés (est-ce une grosse chaîne mappée en mémoire quelque part?) et fournir les options pour organiser les choses demandées.

Je vois également cette initrdoption. Cela pointe vers mes initramfs compressés par gzip, nécessaires pour démarrer le périphérique racine réel spécifié par root=. Mais comment ces initramfs sont-ils fournis au noyau? Il ne reçoit aucune adresse mémoire à l'endroit où il peut le charger, ni ne peut y accéder lui-même, car il est déjà chargé avant le démarrage du noyau. Certaines documentations du noyau indiquent que ce «périphérique» du système de fichiers initramfs est accessible via /dev/ram0, mais je ne vois pas comment il devient un fichier de périphérique accessible pour commencer. Il se passe quelque chose sous l'eau que je ne vois pas, je suppose.

Je ne vois pas non plus comment cela se rapporte aux autres chargeurs de démarrage, y compris les plates-formes intégrées, par exemple en utilisant U-boot / Coreboot. Est-ce que cela fait la même chose que Grub (mêmes adresses mémoire standard?) Et dans quelle mesure cela se compare-t-il à Grub en ce qui concerne le chargement du noyau / initrd?

Juste pour être clair sur mes questions, je pense que je comprends pourquoi les différentes étapes de démarrage existent et quelles transitions ont lieu, mais je ne vois pas comment elles se déroulent et quelles sont les responsabilités exactes de chacune des étapes. J'ai l'impression de manquer une "norme" à laquelle tout se résume.

J'apprécierais quelques explications à ce sujet.


Notez la bootcommande implicite à la fin de la séquence. Je ne sais pas exactement ce qu'il fait dans Grub, mais si vous utilisez la ligne de commande Grub pour entrer ces commandes manuellement, vous devez bootou il restera assis pour toujours grub>(ou du moins, jusqu'à ce que vous vous ennuyiez et éteignez l'ordinateur ). Les commandes précédentes configurent "simplement" un environnement.
un CVn

@ MichaelKjörling D'après ma compréhension maintenant, bootva faire sauter le CPU à l'adresse du noyau chargé (démarrer l'exécution). Pour une entrée de menu, cela est implicitement défini. voyez ça .
gertvdijk

Réponses:


5

En général, il doit y avoir une sorte de protocole car il ne suffit généralement pas de charger un fichier en mémoire et de sauter à un emplacement spécifique, mais vous devez soit passer des arguments supplémentaires comme les paramètres du noyau, c'est-à-dire accéder aux arguments memdisk depuis DOS .

Comme cela dépend du matériel (le bras est différent de x86 par exemple), vous devez trouver les informations correctes, consultez cet article sur le bras de démarrage ou le protocole de démarrage Linux / x86 pour quelques exemples.


6

Le chargeur de démarrage stocke l'initrd dans un emplacement en mémoire et indique au noyau l'adresse mémoire de l'image initrd. La plupart des systèmes Linux modernes utilisent le schéma initramfs utilisant dracut , qui est en fait une archive cpio (plutôt qu'une image disque) qui est décompressée dans un système de fichiers tmpfs créé par le noyau peu de temps après l'exécution.


Je suis allé jusque-là; mais comment le chargeur de démarrage informe-t-il le noyau de l'emplacement en mémoire? Où le noyau récupère-t-il cette adresse mémoire?
gertvdijk

3
@gertvdijk jetez un oeil sur kernel.org/doc/Documentation/x86/boot.txt, il décrit comment le chargeur de démarrage communique avec le noyau, c'est-à-dire que le chargeur de démarrage doit également fournir les paramètres du noyau, etc.
Ulrich Dangel

@UlrichDangel Nice! Exactement ce que je cherchais. Apparemment, c'est un protocole spécifique au matériel (x86 dans ce cas) décrivant tout cela. Écrivez-le comme réponse avec une courte description et je l'accepterai.
gertvdijk
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.