3 votes

Comment le gestionnaire de démarrage de Windows localise-t-il le BCD ?

J'essaie de comprendre le processus de démarrage de Windows. Je suis allé jusqu'à ce que le gestionnaire de démarrage EFI charge le gestionnaire de démarrage Windows. Mais ensuite, il doit accéder au BCD afin de poursuivre le chargement du système d'exploitation ou de charger en chaîne le gestionnaire de démarrage suivant. Comment fait-il exactement pour trouver le BCD ?

Par exemple, dans mon système, il y a deux BCD sur un disque GPT : un sur l'ESP, un autre sur la partition System Reserved, qui a été clonée à partir de l'ancien disque MBR. Le Boot Manager regarde-t-il sur l'ESP simplement parce que le disque est GPT ? Cherche-t-il dans le dossier "current" (existe-t-il un tel dossier à ce stade, étant donné qu'aucun système d'exploitation n'a encore été chargé) ? Ou un algorithme plus compliqué est-il impliqué ?

Un fait curieux : si je supprime la partition System Reserved, le Boot Manager ne démarre pas, se plaignant que le BCD est manquant. Pourtant, si j'apporte des modifications aux deux BCD (par exemple, en définissant des délais différents), les paramètres BCD ESP sont utilisés, comme prévu.

3voto

Johan Myréen Points 485

Le Boot Manager recherche le BCD sur l'ESP car c'est la seule partition connue à ce stade et le firmware ne peut probablement lire que les partitions FAT. Le chemin vers le BCD ( /EFI/Microsoft/Boot/BCD ) sur l'ESP est probablement codé en dur. L'UEFI a été conçu dès le départ pour prendre en charge la coexistence de logiciels provenant de différents fournisseurs, et /EFI/Microsoft est le "terrain de jeu" de Microsoft sur l'ESP.

2voto

Lewis Kelsey Points 394

Je peux répondre à la question de savoir comment il le localise sur un disque MBR avec Windows 7.

Le site Table IPL du BIOS contient le numéro du disque à partir duquel démarrer et le transmet au vecteur de l'entrée qui sera le code partagé par tous les BAIDs. Ce code charge le premier secteur du disque à l'aide de INT 13h a 0x7c00 vérifie si le MBR est valide et passe le contrôle. Le MBR contient un stub qui s'éloigne de l'écran de l'ordinateur. 0x7c00 et charge celui de la partition active (qui correspond au volume A: sur mon OS) d'abord, c'est-à-dire le secteur VBR à 0x7c00 et saute au premier octet de ce premier secteur, qui est le VBR. Je suppose qu'il transmet le numéro de disque au VBR pour qu'il soit utilisé avec les services en mode réel du BIOS.

Le VBR de la partition active charge alors l'IPL (rien à voir avec l'acronyme IPL mentionné précédemment) des secteurs 1 à 15 de la partition dans la mémoire qu'il localise en utilisant HiddenSectors dans la BPB du VBR (HiddenSectors lui indique son numéro de secteur (secteur 0 de la partition) par rapport au début du disque). Le VBR sait où se trouve la BPB par rapport à lui-même et peut donc passer un handle au code IPL (il a déjà été chargé en mémoire parce qu'il fait partie du secteur 0, qui est ce que le MBR a chargé). Il transmet également le numéro du disque, j'imagine. Le code IPL connaît maintenant le nombre de secteurs par cluster et le cluster du MFT, il peut donc chercher le BCD dans le fichier \Boot\BCD en utilisant le code primitif du pilote NTFS dans l'IPL. Il se contente donc de rechercher le répertoire racine sur le MFT dans la BPB qui lui est donnée, qui est bien sûr la BPB de la partition actuelle. C'est pourquoi la partition réservée au système doit être active, sinon le MBR de Windows ne saura pas quelle partition est la partition réservée au système et ne saura donc pas quel VBR charger. La partition MBR+system rsvd VBR+IPL+Bootmgr est le bootloader primaire et winload est le secondaire. Si vous installez Grub, il écrasera le MBR avec son propre stub pour charger son propre bootloader primaire et ne se soucie pas de savoir quelle partition est active. Pour récupérer le MBR qui charge le VBR de la partition active, utilisez bootrec /fixmbr . bootsect /nt60 SYS /mbr est ce qui fixe le VBR et l'IPL sur la partition système.

Je crois que c'est l'IPL qui charge le BCD et le transmet à Startup.com. Cela pourrait facilement être startup.com ou bootmgr qui fait cela mais l'indice est dans le fait qu'il y a une entrée bootmgr avec un chemin bootmgr dans le BCD, donc cela indique à l'IPL l'emplacement de bootmgr.

L'IPL analyse le MFT du système de fichiers NTFS, localise bootmgr, charge la partie startup.com dans l'espace d'adressage en mode réel, dans mon cas, il semble qu'il s'agisse d'environ 0x20000 alias. 2000:0000 et lui transmet le contrôle. Startup.com semble être un fichier CP/M ou CP/M 3 sans la balise C9 numéro magique ou en-tête de 256 octets. Il ne s'agit donc pas d'un fichier DOS, et certainement pas d'un 'DOS stub' (il y en a un au début de bootmgr.exe).

Le programme en mode réel (Startup.com) passe du mode réel 16 bits au mode protégé 16 bits puis 32 bits avec la pagination désactivée. Startup.com utilise l'entrée bootmgr dans le BCD pour localiser bootmgr afin de pouvoir y localiser bootmgr.exe, analyse le MFT sur le volume spécifié (notez que l'entrée contient un nom de périphérique de volume de style volmgr et non la lettre du lecteur, car bootmgr est utilisé par plusieurs installations de Windows et leurs winload.exes respectifs, donc une lettre de lecteur ne signifie rien). bootmgr.exe est à l'offset 0x7BF3 dans bootmgr, pour 0x400000 sur mon système, et le décompresser en utilisant lznt1 à partir de 0x7BF0 . Il passe ensuite le contrôle à bootmgr!BmMain qui reçoit un PBOOT_APPLICATION_PARAMETER_BLOCK contenant un décalage vers un BL_APPLICATION_ENTRY qui contient un BL_BCD_OPTION qui est le premier d'une chaîne d'entiers BCD.

Bootmgr va activer la pagination et passer en mode long 64 bits avant de charger et de passer le contrôle à l'entrée sélectionnée, en utilisant le volume et le chemin de winload.exe dans l'entrée BCD pour analyser le MFT. A ce moment, il sait quelle partition un lien symbolique de volume comme C: correspond à. Je crois que lorsque vous faites bcdedit vous verrez la lettre de lecteur du point de vue du système d'exploitation que vous utilisez actuellement - le BCD stocke simplement la signature MBR + le décalage de la partition dans l'entrée et celle-ci est affichée ou modifiée en utilisant une lettre de lecteur dans le contexte des liens symboliques du système d'exploitation actuel (construits à partir de la base de données mountmgr) pour plus de commodité.

Il charge le winload.exe pour l'entrée du système d'exploitation pour 0x2ef000 sur mon système et passe le contrôle à winload!OslMain . Bootmgr.exe est son propre noyau avec son propre moteur de débogage et ses pilotes. Winload est son propre noyau avec son propre moteur de débogage et ses pilotes. Tous deux ne peuvent gérer le débogage que sur le port COM 1. Winload est responsable du chargement du noyau principal ntosrkrnl.exe, qui possède son propre moteur de débogage et ses pilotes. Notez que x64 supporte toujours MP et qu'il n'y a pas de PAE (donc pas ntkrnlpamp.exe), ils sont donc appelés hal.dll et ntoskrnl.exe au lieu de halmapic.dll et ntkrnlmp.exe, bien qu'il s'agisse essentiellement de ntkrnlmp.exe. Vous pouvez utiliser le .pdb qui a été téléchargé pour le binaire avant que l'option ! Ainsi, si c'est ntkrnlmp.pdb, ce qui sera le cas pour ntoskrnl.exe de Windows 7, vous pouvez utiliser ntkrnlmp! 代わりに nt! dans les débogueurs du noyau de Windows.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X