Apple

Démarrer Mac OS X

Par Maximus , le 3 juin 2019 - 18 minutes de lecture




© Amit Singh. Tous les droits sont réservés.
Écrit en décembre 2003

Démarrer Mac OS X

Cette page contient une brève description du micrologiciel du Mac (analogue au BIOS de l'ordinateur à bien des égards), du chargeur de démarrage et de la séquence de démarrage typique de Mac OS X. Il existe des différences significatives entre l’ancien (68k, PowerMacs "Vieux Monde") et le plus récent (tout actuellement, mais essentiellement des machines "Nouveau Monde" avec Open Firmware 3.x qui charge ROM à partir d'un fichier) démarrer. La discussion ici s’applique aux nouveaux systèmes.

Le micrologiciel ne fait pas partie de Mac OS X, mais il joue un rôle important dans le fonctionnement de la machine et est utile pour le débogage. Par conséquent, nous en discutons ici.

Firmware ouvert

Contexte

Firmware ouvert (Norme IEEE-1275 pour le micrologiciel d'amorçage: exigences et pratiques de base) est un micrologiciel d’amorçage indépendant de la plate-forme (processeur et système). Semblable au BIOS d’un PC, Open Firmware est stocké dans la ROM et est le premier programme enregistré à être exécuté à la mise sous tension.

Une implémentation Open Firmware est basée sur le langage de programmation Forth, en particulier le dialecte FCode (FCode est un dialecte compatible ANS Forth qui prend en charge la compilation de source FCode en bytecode). Apple et Sun sont deux fabricants de systèmes informatiques de premier plan qui utilisent des implémentations d'Open Firmware dans leurs systèmes (la marque de commerce de Sun s'appelle OpenBoot). La page d'accueil du groupe de travail Open Firmware est hébergée à divers endroits, notamment Apple et Sun.

Ainsi, le microprogramme est implémenté dans Forth et stocké dans la ROM en tant que bytecode FCode. Les pilotes de périphérique requis lors du démarrage du système sont également implémentés. De tels pilotes existent généralement dans la ROM d'extension des cartes d'extension nécessaires avant le chargement du système d'exploitation.

Interaction

Vous pouvez entrer Open Firmware en appuyant sur la combinaison de touches cmd-opt-O-F tout comme vous allumez un Macintosh. le cmd la clé est celle avec le logo Apple, et la opter (option) est identique à la touche alt clé. Vous devriez voir un message de bienvenue et un autre verbiage, et vous devriez le déposer dans une invite du type suivant:

D'accord
   0>

Vous pouvez continuer à démarrer la machine en tapant mac-bootou fermez-le en tapant fermer.

Même si ce dernier "shell" supporte une édition de ligne de commande raisonnable (pour un BIOS) (vous pouvez utiliser ctrl-a aller au début d'une ligne, ctrl-e aller jusqu'au bout, ctrl-u pour effacer une ligne, la flèche vers le haut pour l'historique, etc.), vous la trouverez plus pratique (surtout si vous essayez de écrire code dans le micrologiciel) pour accéder au micrologiciel Open Firmware d’un Mac depuis un autre ordinateur (arbitraire), via le réseau. Voici la séquence de commandes à effectuer (tout est tapé à l'invite Open Firmware, sauf indication contraire):

0> dev / packages / telnet

Notez qu'en cas de succès, Open Firmware imprime la chaîne "D'accord" sur le même ligne en appuyant sur . Dans les exemples de cette page, si vous voyez D'accord, rappelez-vous qu’il est imprimé par Open Firmware et que vous n’êtes pas censé le taper (ce n’est pas un mot Open Firmware valide de toute façon).

Si le micrologiciel Open Firmware de votre Mac inclut la telnet paquet, vous verriez:

0> dev / packages / telnet ok

Si vous obtenez un D'accord, vous pouvez y exécuter un serveur TELNET:

"enet: telnet, 10.0.0.1" io

Cela ferait fonctionner un serveur TELNET sur la machine avec une adresse IP 10.0.0.1 (vous pouvez et devez choisir une adresse appropriée). Ensuite, vous pouvez vous connecter à Open Firmware sur cette machine à l'aide d'un client TELNET, par exemple à partir d'une machine Windows. Voir Les tours de Hanoi dans Open Firmware pour un exemple de programmation.

Notez que les ordinateurs Apple actuels (au moins G4 et au-dessus) sont livrés avec des ports Ethernet à détection et configuration automatiques. ne pas besoin d'un câble croisé pour le connecter directement à un autre ordinateur (aucun concentrateur requis, etc.).

Exemples

1. La commande suivante imprime l’arborescence des périphériques:

0> dev / ls
ff880d90: / cpus
ff881068: / PowerPC, 750 @ 0
ff881488: / l2-cache
ff882148: / choisi
ff882388: / memory @ 0
ff882650: / openprom
ff882828: / service-client
...
Plus[[[[,, q, a]? _

2 La commande suivante vous donne des informations sur la RAM installée:

0> dev / memory .properties ok
Nom de la mémoire
type_périphérique
reg 00000000 10000000
                           10000000 10000000
noms d'emplacement 00000003
                           SODIMM0 / J25LOWER
                           SODIMM1 / J25UPPER
...
SDRAM DDR de type dimm
                           SDRAM DDR
vitesses de variation PC2700U-25330
                           PC2700U-25330
...

La machine dans la commande ci-dessus (un PowerBook G4 15, bien que cela ne soit pas pertinent) a deux puces PC2700 DDR SDRAM installées. Les deux paires de nombres contre reg sont spécifier l'adresse de départ et la taille des puces. Ainsi, la première puce RAM commence à l'adresse 0x0000000 et a une taille 0x10000000 (qui est 256 Mo). La deuxième puce commence à 0x1000000 (256 Mo) et a une taille de 256 Mo. La RAM totale est donc de 512 Mo.

Si vous avez besoin réduire la taille de la RAM installée (telle que vue par Mac OS X) pour une raison quelconque, sans avoir à retirer une clé USB (ou si vous souhaitez simuler une taille arbitraire inférieure à la RAM totale installée), vous pouvez réellement effacer la reg entrée en utilisant le delete-property commande, et spécifiez votre propre reg. En référence à l'exemple précédent du PowerBook de 512 Mo, la commande suivante consiste essentiellement désactive la deuxième clé de mémoire vive (notez que ce changement est ne pas écrit dans la NVRAM – il est transitoire – une fois que vous redémarrez, l’autre puce sera détectée et utilisée comme auparavant):

0> "reg" delete-property ok
0> 0 encode-int 10000000 encode-int encoder + propriété "reg" ok

Il faut toutefois garder à l'esprit que les propriétés de registre peuvent changer d'une machine à l'autre, ou plus probablement lorsque des modifications d'architecture sont effectuées (par exemple, le format a été modifié avec le PowerMac G5). Un moyen moins aventureux et plus approprié de limiter la RAM visible consiste à utiliser le maxmem argument de démarrage, par exemple à l'invite du shell:

# nvram boot-args = "maxmem = 128"

3 La séquence de commandes suivante vous montre diverses informations sur les CPU de la machine:

0> dev / ok
0> dev / cpus ok
0> ls
ff886d58: / PowerPC, G4 @ 0
ff8871f8: / l2-cache
 D'accord
0> dev PowerPC, G4 @ 0 ok
0> .properties
nommer cpu
reg 00000000
version cpu 80020101
état en cours d'exécution
fréquence d'horloge 4a817c7b
fréquence de bus 09ef21aa
...

Le reste de la sortie contient diverses tailles de cache, les capacités graphiques du processeur (Altivec, prise en charge de certaines instructions, …), etc. Vous pouvez penser à cela comme analogue à / proc / cpuinfo sur Linux.

4 La commande suivante répertorie les fichiers du répertoire racine du disque (partition) désigné par "alias". haute définition

0> dir hd:

        Taille / Fichier GMT / Dir
        octets date heure Nom
         6148 12/25/3 4:25:25 .DS_Store
          156 9/12/3 20:41:59 .hidden
       589824 12/25/3 6:45: 6 .hotfiles.btree
...

5 La commande suivante développe l'alias haute définition, et vous donne le chemin complet du périphérique dans l’arborescence (tapez devalias seul pour voir une liste des alias actuels, avec ce à quoi ils se réfèrent):

0> devalias hd / pci @ f4000000 / ata-6 @ d / disk @ 0 ok

6 Vous pouvez charger un fichier (noyau) en utilisant le charge commande et amorcez-la en utilisant démarrage commander. Comme indiqué précédemment, mac-boot et fermer sont prédéfinis pour démarrer l'ordinateur normalement ou pour l'éteindre, respectivement. Vous pouvez obtenir et définir des variables (options) à l’aide des touches printenv et setenv commandes. Ces variables sont stockées dans la mémoire non volatile (NVRAM) d'Open Firmware. Par exemple, si vous souhaitez que votre adresse électronique soit utilisée comme "bannière OEM", procédez comme suit:

0> setenv oem-banner vous@votre.email.adresse
0> setenv oem-banner? vrai

En fait, il n'est pas nécessaire d'accéder à Open Firmware pour définir les variables NVRAM. Vous pouvez y accéder (obtenir et configurer) à partir de Mac OS X via le nvram utilitaire de ligne de commande.

En résumé, Open Firmware est un puissant outil de contrôle, de débogage et d’exploration de l’ordinateur.

Opération

Lorsqu'un Macintosh équipé d'Open Firmware (tous les systèmes Apple actuels au moment de l'écriture) est allumé, le matériel est diagnostiqué (par un code POST) et initialisé. La première entité à contrôler ensuite la CPU est le firmware. Open Firmware (qui fonctionne avec les interruptions désactivées) crée une arborescence de périphériques, sonde les logements pour les périphériques, interroge les périphériques PCI et leur attribue un espace d'adressage approprié, puis recherche le périphérique d'amorçage par défaut (à moins que l'un d'entre eux ait été spécifié explicitement). Les touches "accrochage" suivantes permettent à l'utilisateur de spécifier un périphérique d'amorçage lorsque le système est sous tension:

Périphérique C désigné par l'alias 'cd', un lecteur de CD-ROM
Périphérique D désigné par l’alias 'hd', un disque dur
N périphérique désigné par l'alias 'enet', une carte réseau
Périphérique Z désigné par l'alias 'zip', un lecteur ZIP

Il convient de noter que le fait de presser T tandis que votre Mac allume le démarrer dans ce qu'on appelle le Mode disque cible FireWire. Essentiellement, votre Mac devient un lecteur de disque FireWire externe sophistiqué.

Vous pouvez également spécifier le chemin d'accès complet d'un périphérique ou laisser l'ordinateur démarrer sur le réseau à l'aide de TFTP:

démarrage enet:,,;,

Si Open Firmware ne parvient pas à trouver un périphérique d’amorçage, un dossier clignotant est affiché.

Open Firmware charge ensuite un fichier de type tbxi (Image ROM ToolBox, pour des raisons historiques) à partir de la partition système. Notez que cela aurait été le fichier appelé "Mac OS ROM"dans le dossier système sous Mac OS 9, pendant le chargement de OS X / Système / Bibliothèque / CoreServices / BootX, qui est aussi le chargeur de démarrage. BootX est ensuite exécuté et Control lui est ensuite transmis.

Notez qu'Open Firmware peut charger directement des fichiers binaires ELF, XCOFF et "bootinfo" (tout format pris en charge avec un en-tête XML), mais pas Mach-O, le format d'exécutable natif de Mac OS X. BootX peut charger des fichiers binaires Mach-O.

Chargeur de démarrage

BootX (/ Système / Bibliothèque / CoreServices / BootX) est le chargeur de démarrage par défaut sous Mac OS X.

BootX est également le nom d'un chargeur de démarrage open source (différent de BootX d'Apple) qui permet le double amorçage de Mac OS et Linux sur des machines "Old World".

BootX peut charger des noyaux de différents systèmes de fichiers: HFS +, HFS, UFS, ext2 et TFTP (réseau, résumé pour ressembler à un système de fichiers). En plus de Mach-O, BootX peut également charger des noyaux ELF, bien que Mac OS X n’utilise pas cette fonctionnalité. Pour rappel, BootX peut charger des noyaux ELF depuis une partition ext2!

Les Macs "Old World" ont eu divers problèmes avec la mise en oeuvre de Open Firmware, ce qui a causé de nombreux problèmes de démarrage pour les ingénieurs Apple, et encore plus de problèmes pour le port Linux PowerPC. Maintenant, Apple avait accès à la source du firmware. Ils ont résolu la plupart des problèmes soit via des correctifs NVRAM, soit en intégrant les modifications requises dans BootX lui-même (dans les cas où les modifications ne pouvaient pas être mises en œuvre sous forme de correctifs). À mesure que BootX arrivait à maturité, Apple a ajouté la prise en charge d'ext2 et d'ELF dans le but de rendre la plate-forme plus compatible avec PowerPC Linux.

La séquence d'événements à laquelle BootX commence à s'exécuter (après avoir été contrôlée par Open Firmware) est décrite ci-dessous:

  • BootX initialise d’abord l’interface client Open Firmware (qu’il utiliserait pour communiquer avec le microprogramme), puis récupère la version du microprogramme.
  • Il crée ensuite un pseudo-périphérique appelé sl_words ('sl' implique chargeur secondaire) dans le firmware et y définit divers mots FORTH (c’est ici que le code du curseur en rotation est configuré).

  • BootX lève les yeux options dans le micrologiciel, qui contient diverses variables (que vous pouvez voir et régler à l’aide de la printenv et setenv commandes dans Open Firmware).

0> dev / options .properties
options de nom
petit endian? faux
mode réel? faux
auto-boot? vrai
diag-switch? faux
...
commande de démarrage mac-boot
...

  • BootX lève les yeux choisi device, qui contient les descripteurs d'entités telles que les périphériques d'entrée / sortie de démarrage, la mémoire, la MMU, la PMU, la CPU, le PIC, etc. Par exemple, la commande suivante à l'invite Open Firmware vous montre le contenu de choisi:

0> dev / choisi ok
0> .properties
nom choisi
stdin ffbc6e40
stdout ffbc6600
mémoire ffbdd600
mmu ...
...

  • BootX initialise les descripteurs sur la MMU et la mémoire à l'aide de choisi.

  • BootX initialise les poignées sur l'écran de démarrage et le clavier (le cas échéant).

  • BootX vérifie si le "mode de sécurité" est "aucun", ou

  • BootX vérifie si le "verbose" (cmd-v) ou "utilisateur unique" (cmd-s) ont été spécifiés et définit le "niveau de sortie" en conséquence.

  • BootX vérifie si le système démarre en "Mode sans échec".
  • BootX réclame de la mémoire à diverses fins.
  • BootX trouve tous les écrans et les configure. Pour ce faire, il recherche les nœuds de type "display" dans l’arborescence de périphériques. L’affichage principal est désigné par le écran alias. Par exemple, vous pouvez essayer ceci à l’invite Open Firmware:

0> écran de développement ok
0> .properties
nom ATY, Bee_A
compatible ATY, Bee
largeur 00000400
hauteur 00000300
linebytes 00000400
profondeur 00000008
type d'affichage 4c434400
affichage du type de périphérique
jeu de caractères ISO859-1
...

  • Lors de l'ouverture des écrans, BootX définit également la couleur de l'écran sur le gris blanchâtre familier.
  • BootX recherche le périphérique de démarrage, les arguments de démarrage, etc., et détermine où obtenir le noyau (via un périphérique réseau, à partir d'un périphérique en mode bloc, etc.), d'où le chemin d'accès au fichier du noyau (mach_kernel) est construit. Si vous démarrez depuis un périphérique bloc (ce qui est le cas habituel), le chemin du cache kext (voir kextcache (8)) est calculé, ainsi que le répertoire des extensions (généralement / Système / Bibliothèque / Extensions).

Mac OS X utilise plusieurs types de caches "kext" (extension du noyau) pour accélérer le chargement des kexts. Les caches du noyau sont conservés dans le répertoire /System/Library/Caches/com.apple.kernelcaches. Les fichiers de cache sont nommés kernelcache.XXXXXXXX, où le suffixe est un 32 bits adler somme de contrôle (le même algorithme que celui utilisé par Gzip).

  • À ce stade, BootX dessine l'écran de démarrage du logo Apple et lance le curseur en rotation. Si vous démarrez à partir d'un périphérique réseau, un globe en rotation est dessiné à la place.
  • En fonction de diverses conditions, BootX essaie de récupérer et de charger le fichier cache du noyau.
  • La prochaine étape consiste à "décoder" le noyau. Si l'en-tête du noyau indique un noyau compressé, BootX tente de le décompresser (la compression LZSS typique est utilisée, car vous compressez ce type de données une fois, mais vous le développez plusieurs fois). Etant donné que le binaire du noyau peut potentiellement être un "gros" binaire (code pour plusieurs architectures résidant dans le même binaire), BootX vérifie si c'est effectivement (fat), et si c'est le cas, "l'amincit" (calcule le code PowerPC).

  • BootX tente de décoder le fichier (éventuellement "aminci") en tant que binaire Mach-O. Si cela échoue, BootX essaie également de le décoder en tant que ELF.

  • Si ce qui précède échoue, BootX abandonne, dessine l’image de démarrage défaillante et passe dans une boucle infinie.

  • Si BootX réussit jusqu’à présent, il enregistre les occurrences dans le cache du système de fichiers, les échecs et les expulsions, configure divers arguments et valeurs d’amorçage (par exemple, qu’il s’agisse d’un amorçage graphique ou prolixe, de la présence ou non d’indicateurs de RAM installée), et appelle également une fonction récursive pour aplatir l’arborescence de périphériques.

  • Enfin, BootX "appelle" le noyau, immédiatement avant de "suspendre" Open Firmware, opération à la suite de laquelle toute tâche asynchrone dans le microprogramme, les minuteries ou le DMA est arrêtée, etc.

Démarrage du système

Le démarrage au niveau utilisateur de Mac OS X n’est ni un style BSD pur, ni un style SYSV, bien que la présence de / etc / rc indique un héritage BSD. En fait, diverses choses ressemblent sans surprise à NEXTSTEP.

La section suivante, XNU: le noyau, décrit certaines des choses que le noyau fait au fur et à mesure. Démarrage du système Mac OS X continue avec une description du démarrage (principalement) au niveau utilisateur.

BootCache

Mac OS X utilise une optimisation au démarrage (en fait un mot de passe intelligent) appelée "BootCache" qui surveille le modèle des demandes de lecture entrantes adressées à un périphérique bloc (le disque de démarrage) et le trie dans une "liste de lecture" (il mesure également le taux de réussite de la mémoire cache et stocke le modèle de demande dans une "liste d'historique" pour pouvoir l'adapter ultérieurement.

Le modèle de lecture chargeable (trié) est stocké dans /var/db/BootCache.playlist. Une fois que cela est chargé, le cache entre en vigueur.

Notez que cette fonctionnalité nécessite au moins 128 Mo de RAM physique avant son activation (automatiquement).

/System/Library/Extensions/BootCache.kext est l'emplacement de l'extension du noyau implémentant le cache tout en Contenu / Ressources / BootCacheControl dans ce répertoire se trouve l'utilitaire de contrôle au niveau utilisateur (il vous permet de charger la liste de lecture, entre autres). L'efficacité de BootCache peut être évaluée à partir des éléments suivants: dans une récente mise à jour de "Panther", une référence à BootCacheControl a été rompue. BootCache est démarré (via l'utilitaire de contrôle) en / etc / rcet une balise prefetch est insérée (à moins que le système ne démarre en mode sans échec). / etc / rc cherche des BootCacheControl dans le répertoire "kext", ainsi que dans / usr / sbin, et le trouve dans le premier (il n’existe pas dans le second). Cependant, un autre programme (éventuellement loginwindow.app) accès / usr / sbin / BootCacheControl directement, et ne le trouve pas. Pour ce que ça vaut, faire BootCacheControl disponible en / usr / sbin, disons via un lien symbolique, réduit le temps de démarrage (mesuré en cliquant sur le bouton de confirmation "Redémarrer" au point où absolument tout a été affiché dans le menu système) de 135 secondes à 60 secondes sur l’une de mes machines!

Maximus

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.