GNU/Linux >> Tutoriels Linux >  >> Linux

Comment Linux charge-t-il l'image 'initrd' ?

Plus loin, je vais essayer de répondre à votre question, mais pour une description plus complète du processus de démarrage, essayez cet article sur IBM.

Ok, je suppose que vous utilisez GRUB ou GRUB2 comme chargeur de démarrage pour explication. Tout d'abord, lorsque le BIOS accède à votre disque pour charger le chargeur de démarrage, il utilise ses routines intégrées pour l'accès au disque, qui sont stockées dans la fameuse interruption 13h. Le chargeur de démarrage (et le noyau lors de la phase de configuration) utilisent ces routines lorsqu'ils accèdent au disque. Notez que le BIOS s'exécute en mode réel (mode 16 bits) du processeur, il ne peut donc pas adresser plus de 2 ^ 20 octets de RAM (2 ^ 20, pas 2 ^ 16, car chaque adresse en mode réel est composée de segment_address * 16 + offset, où l'adresse de segment et l'offset sont de 16 bits, voir "segmentation de la mémoire x86" sur Wikipedia). Ainsi, ces routines ne peuvent pas accéder à plus de 1 Mo de RAM, ce qui est une limitation stricte et un inconvénient majeur.

Le BIOS charge le code du chargeur de démarrage directement à partir du MBR - les 512 premiers octets de votre disque - et l'exécute. Si vous utilisez GRUB, ce code est l'étape 1 de GRUB. Ce code charge l'étape 1.5 de GRUB, qui se trouve soit dans les premiers 32 Ko d'espace disque, appelés région de compatibilité DOS, soit à partir d'une adresse fixe du système de fichiers. Il n'a pas besoin de comprendre la structure du système de fichiers pour ce faire, car même si l'étape 1.5 est dans le système de fichiers, il s'agit de code "brut" et peut être directement chargé dans la RAM et exécuté :Voir "Détails de GRUB sur le PC " sur pixelbeat.org, qui est la source de l'image ci-dessous. Le chargement de stage1.5 du disque à la RAM utilise les routines d'accès au disque du BIOS.

Stage1.5 contient les utilitaires du système de fichiers, afin qu'il puisse lire l'étape 2 à partir du système de fichiers (enfin, il utilise toujours le BIOS 13h pour lire du disque à la RAM, mais maintenant il peut déchiffrer les informations du système de fichiers sur les inodes, etc., et obtenir du code brut hors du disque). Les BIOS plus anciens peuvent ne pas être en mesure d'accéder à l'ensemble du disque dur en raison des limitations de leur mode d'adressage de disque - ils peuvent utiliser le système Cylinder-Head-Sector, incapable d'adresser plus de 8 Go d'espace disque :http://en.wikipedia. org/wiki/Cylinder-head-secteur.

L'étape 2 charge le noyau dans la RAM (encore une fois, en utilisant les utilitaires de disque du BIOS). S'il s'agit d'un noyau 2.6+, initramfs est également compilé, il n'est donc pas nécessaire de le charger. S'il s'agit d'un noyau plus ancien, le chargeur de démarrage charge également une image initrd autonome dans la mémoire, afin que le noyau puisse le monter et obtenir des pilotes pour monter le système de fichiers réel à partir du disque.

Le problème est que le noyau (et le disque virtuel) pèsent plus de 1 Mo; ainsi, pour les charger dans la RAM, vous devez charger le noyau dans le premier 1 Mo, puis passer en mode protégé (32 bits), déplacer le noyau chargé en mémoire haute (libérer le premier 1 Mo pour le mode réel), puis revenir en mode réel (16 bits), récupérez le disque virtuel du disque au premier 1 Mo (s'il s'agit d'un noyau initrd séparé et plus ancien), revenez éventuellement en mode protégé (32 bits), placez-le à l'endroit où il appartient, obtenez éventuellement revenir en mode réel (ou non :https://stackoverflow.com/questions/4821911/does-grub-switch-to-protected-mode) et exécuter le code du noyau. Avertissement :Je ne suis pas tout à fait sûr de la rigueur et de l'exactitude de cette partie de la description.

Maintenant, lorsque vous exécutez enfin le noyau, vous l'avez déjà et le disque RAM est chargé dans la RAM par le chargeur de démarrage , afin que le noyau puisse utiliser les utilitaires de disque du disque virtuel pour monter votre véritable système de fichiers racine et faire pivoter la racine vers celui-ci. Les pilotes ramfs sont présents dans le noyau, il peut donc comprendre le contenu d'initramfs, bien sûr.


Linux
  1. Linux - Comment inspecter les informations de structure de répertoire d'un fichier Unix/linux ?

  2. Linux - Comment le noyau Linux se compare-t-il aux architectures de micro-noyau ?

  3. Comment fonctionne la commande 'ls' sous Linux/Unix ?

  4. Comment fonctionne copy_from_user du noyau Linux en interne ?

  5. Compilation du noyau Linux, quelle taille est nécessaire ?

Comment le noyau Linux gère les interruptions

Comment compiler un noyau Linux au 21e siècle

Comment charger ou décharger un module du noyau Linux

Comment vérifier la version du noyau sous Linux

Comment le noyau Linux se compare-t-il aux architectures de micro-noyau ?

Comment Linux conserve-t-il le contrôle du processeur sur une machine monocœur ?