2020-05-21

Rétro : Le démarrage des Macintosh 68k / PPC

By pblazquez

Parce que j’aime bien l’histoire de l’informatique en général et celle d’Apple en particulier, il m’arrive de récupérer d’anciens appareils (surtout des Mac) afin de les conserver et de tester des choses avec. Et donc, pourquoi ne pas faire une série d’articles “Rétro” à leur sujet ?


J’en avais parlé dans le post sur le PowerBook G3, et ça m’a donné l’envie d’écrire un nouveau post sur le sujet : le démarrage des Macintosh “vintage” 68k et PowerPC.

Entendons-nous sur ce qui est actuellement considéré comme des Mac vintage d’un point de vue de collectionneur :

  • Les Macintosh à base de CPU Motorola 680×0, ou 68k (1984 à 1994)
  • Les Macintosh à base de CPU PowerPC, ou PPC (1994 à 2006)

Apple définit ses appareils vintages comme ceux n’étant plus vendus depuis 5 à 7 ans. Un appareil retiré de la vente depuis plus de 7 ans est lui considéré comme obsolète. Techniquement donc, les premiers Mac Intel sont vintages du point de vue constructeur, voire obsolète. Ça n’en fait pas des modèles de collection pour autant : les volumes produits sont bien plus importants, certains sont toujours compatibles avec des versions récentes de macOS et il est facile d’en trouver sur le marché de l’occasion.

La liste est mise à jour régulièrement et est disponible sous forme d’article sur le Support Apple.

Depuis 1984, les Macintosh ont connu 4 procédés de démarrage différents :

  • La Macintosh ROM, pour les Macintosh 68k (1984 à 1994)
  • L’Old-World ROM, pour les Macintosh PPC (1994 à 1998)
  • La New-World ROM, pour les Macintosh PPC (1998 à 2006)
  • L’UEFI, pour les Mac Intel (2006 -)

Macintosh ROM

La Macintosh ROM fait son apparition dans la famille Mac avec le premier modèle commercialisé en 1984, rétrospectivement connu sous le nom de Macintosh 128k.

Physiquement, la ROM se présente de deux façons, soit soudée sur la carte mère, soit sur un socket. Dans ce cas, il est possible de la changer (sous conditions).

Carte mère de Macintosh SE/30 (1989). La ROM est à gauche sur un socket (encadré jaune). Le CPU Motorola 68030 est à droite (encadré orange).

Cette ROM et son contenu a évolué à chaque nouveau modèle commercialisé, mais son fonctionnement reste fondamentalement identique pour toutes ses versions.

La Macintosh ROM embarque la Macintosh Toolbox, une compilation de routines logicielles considérées par les ingénieurs comme “essentielles” au Macintosh. De fait, la présence en ROM de ces routines présente des avantages : elles sont toujours disponibles sans avoir à les charger depuis un stockage de masse, leur accès par le CPU nécessite moins de ressources et surtout, le coût de la ROM était moindre que celle de la RAM.

La Macintosh Toolbox comprend ainsi le nécessaire pour la prise en charge de la souris, pour afficher des formes à l’écran, et pour gérer la barre de menus. Le reste du système est chargé en RAM soit par des disquettes, soit par un disque dur pour les Macintosh qui en étaient pourvus. Un mécanisme de patch dynamique permet aussi de charger et d’utiliser en RAM une nouvelle version d’une procédure stockée en ROM, par définition non modifiable. Pratique si la procédure d’origine était buggée par exemple…

La Toolbox, en plus de contenir une partie des ressources fondamentales du système, est également mise à contribution pour démarrer le Macintosh.

Pas content !

Lorsque l’ordinateur est allumé, la Toolbox contenue en ROM est initialisée. Elle va effectuer un Power On Self Test (ou POST), et en cas d’erreur jouer le Death Chime et afficher l’icône du Sad Mac (ou Mac triste) avec un code indiquant quelle routine de démarrage a rencontré un problème. S’il n’y a pas d’erreur, le Boot Chime est joué et la Toolbox initialise l’écran.

La Toolbox va ensuite chercher dans la PRAM (Parameter RAM, un petit stockage où sont gardés les paramètres comme la date, l’heure et le disque de démarrage) quel disque a été désigné pour démarrer. S’il n’y a pas de disque spécifié ou s’il est introuvable, elle va vérifier dans le lecteur de disquettes puis itérer dans les périphériques SCSI pour trouver un périphérique valide. S’il n’y a toujours aucun périphérique, une disquette avec un point clignotant s’affiche pour indiquer à l’utilisateur qu’un disque système est requis pour continuer.

Hello!

Lorsqu’un disque est trouvé, les boot blocks stockés au début de ce dernier sont exécutés et vont vérifier si un dossier Système est présent et peut être utilisé pour démarrer. Si tout est OK, un Happy Mac (ou Mac heureux) est affiché et le dossier Système est chargé en mémoire, puis enfin le Finder.

La Macintosh Toolbox sera le bootloader principal jusqu’à l’introduction des premiers Macintosh PowerPC, les Power Macintosh 6100, 7100 et 8100 sortis en mars 1994.

Old-World ROM

Dans tous les Macintosh équipés de PowerPC est intégré Open Firmware. Ce nom désigne à la fois un standard de firmware (IEEE 1275-1994) promu à l’origine par Sun Microsystems et l’implémentation faite par Apple. Des implémentations d’Open Firmware ont également vécues sous d’autres noms (comme OpenBoot ou SmartFirmware). Je ne vais pas m’étendre sur le sujet, Open Firmware est un élément assez complexe et intéressant. Il mérite un post à part.

Dans le procédé Old-World, la Macintosh ROM est toujours présente physiquement, mais n’est plus initialisée directement.

Au démarrage de la machine, un POST est effectué puis Open Firmware (OF en abrégé) est initialisé. Une découverte des périphériques PCI est lancée. Le résultat sera stocké dans le Device Tree, une représentation hiérarchique des compostants de l’ordinateur. La Macintosh ROM étant visible comme un périphérique, elle est découverte par OF au chemin /AAPL,ROM.

De par sa conception, OF utilise 4 variables stockées en NVRAM (Non Volatile RAM, successeur de la PRAM) pour coordonner le lancement de l’OS : auto-boot, boot-device, boot-file et boot-command :

  • auto-boot : booléen qui indique si OF doit directement appeler la boot-command pour continuer le boot ou s’arrêter sur le Shell
  • boot-device : chemin OF vers le disque contenant le fichier bootinfo qui sert au boot de l’OS
  • boot-file : nom du fichier bootinfo, optionnel
  • boot-command : commande à appeler pour démarrer l’OS (généralement mac-boot, ou dans certains cas, boot)

Vous avez trouvé ? Dans le procédé Old-World, la variable boot-device a comme valeur par défaut /APPL,ROM, ce qui indique à OF de continuer la procédure de démarrage sur la Macintosh ROM ! Une fois cette dernière initialisée et la Macintosh Toolbox chargée, la procédure de démarrage classique des Macintosh 68k peut continuer !

Open Firmware est donc réduit à l’état de bootstrapper dont le seul but est de charger la Toolbox depuis la ROM. Rendez-vous compte : les premiers Power Macintosh ne pouvaient même pas afficher Open Firmware sur l’écran principal, il fallait utiliser une liaison série !

En prime, la Toolbox et Système (renommé Mac OS après 7.6), toujours écrits majoritairement pour les 68k peuvent fonctionner sur PPC car un émulateur de processeur Motorola 68040 est inclus, sans ralentissement sensible pour l’utilisateur ! Système 7.1.2 sera la première version à être compatible PowerPC.

Par voie de conséquence, les gains de vitesse de l’OS annoncés par Apple les années suivantes seront grandement dûs à la réécriture version après version de composants du système en code PowerPC natif plutôt qu’en 68k qui est émulé… Cette réécriture dans la durée rendra l’OS incompatible avec les processeurs 68k à partir de Mac OS 8.5, sorti en octobre 1998, soit 4 ans après l’introduction des premiers Power Macintosh et 8 ans après les premiers travaux d’Apple sur l’architecture PowerPC, Apple ayant rejoint l’alliance AIM (Apple-IBM-Motorola) en 1991.

Mais en 1998, surprise !

New-World ROM

Dans la seconde moitié des années 1990, Apple et Oracle (Steve Jobs et Larry Ellison, CEO d’Oracle, sont de grands amis) collaborent sur un projet de Macintosh particulier : le Macintosh NC, pour Network Computer. Il devait être un client léger, dépourvu de stockage local, vendu moins cher, et capable de charger un OS depuis un emplacement réseau. Cet ordinateur ne sera jamais finalisé ni commercialisé, le projet se recentrant vers un Macintosh équipé d’un stockage local, mais axé vers Internet avec une connectique en rupture avec ce qui se faisait alors (notamment avec l’USB, un modem et l’Ethernet en série mais aussi la fin du lecteur de disquette et de l’ADB) : l’iMac.

Nous sommes en 1998, l’iMac vient d’être présenté. Bien que toujours basé sur un PowerPC (un G3 en l’occurence), cette nouvelle machine inaugure le procédé New-World (par opposition à l’ancien procédé rétrospectivement appelé Old-World), décrit par Apple dans une fiche technique, dont une copie miroir est encore disponible.

Ce procédé est directement hérité des travaux sur le Macintosh NC, qui devait s’articuler autour d’une distinction franche entre le hardware et l’OS, contrairement à l’entremêlement bas niveau et haut niveau de la Macintosh ROM équipant les ordinateurs Apple vendus à l’époque. Une autre technologie sera également issue de ces travaux, NetBoot, qui a permis jusqu’à macOS 10.15 Catalina de démarrer des Mac avec une copie distante du système.

Dans cette configuration, la ROM de démarrage, nommée BootROM, est réduite à sa portion congrue : exit la Macintosh Toolbox, la BootROM se concentre sur :

  • Le POST (qui se termine par le “Bong” de démarrage)
  • L’initialisation de Open Firmware, qui au passage voit ses capacités étendues : gestion des pilotes vidéo, possibilité de démarrer en réseau,…

Open Firmware, une fois initialisé, procède à la découverte des périphériques et construit le Device Tree. Mais contrairement à l’Old-World, où OF se contenait de charger la Macintosh ROM désignée comme boot-device, la variable est dynamique et a comme valeur par défaut :

boot-device = hd:,\\:tbxi

Cette valeur peut être décomposée comme ceci :

  • ‘hd:’ : chemin vers le périphérique de démarrage
  • ‘,’ : séparateur entre le périphérique et le chemin vers bootloader de l’OS
  • ‘\\’ : représentation du dossier spécial contenant le fichier bootinfo, ou bootloader, de l’OS à démarrer
  • ‘:tbxi’ : plutôt que de mettre une valeur à boot-file, on indique à OF de trouver un fichier bootinfo de type TBXI
Contenu de la NVRAM sur un iMac G4, vu depuis Open Firmware.

Ce nouveau fonctionnement implique qu’Open Firmware n’est plus un simple bootstrapper pour la Macintosh ROM : il peut dorénavant charger d’autres OS que Mac OS Classic ou Mac OS X sur un Macintosh. L’OS doit simplement fournir un fichier bootinfo pour que OF puisse le charger. Des UNIX-likes comme FreeBSD, OpenBSD et des distributions GNU/Linux ont eu ou ont toujours des versions compatibles Open Firmware et PowerPC.

Question : comment Open Firmware fait-il pour vraiment savoir sur quel disque démarrer ?

En fait, ‘hd’ n’est qu’un alias. Open Firmware a la capacité de gérer des alias de périphériques pour généraliser sa configuration. Ainsi, si pour tous les Macintosh PPC, le disque de démarrage en sortie d’usine est un disque dur, son emplacement physique peut différer en fonction des machines (sur quel port ATA, par exemple). L’alias indique donc l’emplacement réel du disque de démarrage tel que désigné dans le Device Tree.

Liste des alias Open Firmware sur un iMac G4. L’alias ‘hd’ désigne ici le premier disque IDE attaché au contrôleur ATA.

Question : comment Open Firmware fait-il pour savoir où est le dossier spécial ?

De la même façon que ‘hd’ est un alias vers le disque de démarrage, ‘\\’ est une notation qui indique à Open Firmware d’utiliser le dossier spécial contenu dans ledit disque.

Pour connaître l’emplacement de ce dossier, Open Firmware va aller récupérer l’information dans les métadonnées du disque. À cette fin, OF contient le pilote requis pour naviguer dans les disques formatés en HFS / HFS+. Ce dossier spécial est désigné comme le blessed folder, ou “dossier béni”.

Informations contenues dans les métadonnées HFS+ du disque de démarrage d’un iMac G4 avec Mac OS X.

Pour Mac OS Classic, le blessed folder est le dossier Système à la racine du disque. Pour Mac OS X, c’est le dossier CoreServices dans /System/Library.

Question : comment Open Firmware fait-il pour localiser le bootinfo dans le blessed folder ?

Jusqu’ici, on a vu comment OF sait trouver le disque de démarrage et l’emplacement du blessed folder sur ce disque. La dernière étape consiste à trouver le fichier bootinfo permettant de démarrer l’OS.

Pour cela, Open Firmware va ouvrir le disque de démarrage, se placer dans le blessed folder et chercher un fichier bootinfo, de type TBXI, qu’il chargera et qui sera utilisé comme bootloader.

TBXI signifie ToolboxImage. C’est la finalité de l’approche ‘ROM-in-RAM’ d’Apple pour le procédé New-World : la Macintosh Toolbox n’est plus présente physiquement dans une ROM, mais est chargée en RAM par Open Firmware.

Concrètement, pour une installation de Mac OS Classic, il s’agit du fichier ‘Mac OS ROM’ présent dans le dossier Système, dont le fonctionnement est assez simple :

  • un script Open Firmware va placer en RAM un Trampoline et la Macintosh Toolbox,
  • Le contrôle est donné au Trampoline qui va convertir les informations Open Firmware en informations compréhensibles par la Toolbox
  • Une fois les informations converties, Open Firmware est quitté, l’espace mémoire utilisé par la Toolbox est marqué en lecture seule
  • Le contrôle est donné à la Macintosh Toolbox, qui va utiliser les données recueillies par le Trampoline pour charger Mac OS

Et voilà, Mac OS Classic se lance !

Question : Comment Open Firmware fait-il pour booter Mac OS X ?

Contrairement à Mac OS Classic (dont les fondations sont totalement différentes, on y reviendra peut-être dans un autre post), Mac OS X ne fait pas appel à la Toolbox pour son démarrage. À la place, Mac OS X dispose d’un nouveau bootinfo nommé BootX, qui remplace Mac OS ROM.

Le début de la séquence de démarrage est le même : la BootROM initialise Open Firmware qui va chercher un fichier bootinfo pour continuer le démarrage de l’OS.

Dans le cas de Mac OS X, le fichier bootinfo est justement BootX, à l’emplacement

/System/Library/CoreServices/BootX

Si on regarde de plus près BootX avec un simple cat, on voit bien la structure du bootinfo attendu par Open Firmware :

Déclaration d’un fichier bootinfo compatible PowerPC, semblable à du XML.

[Représentation textuelle du logo Mac OS X utilisé par le sélecteur Open Firmware, tronqué ici]

Le script Open Firmware qui va lancer l’exécutable contenu dans le fichier bootinfo.

[L’exécutable du bootloader est à la suite du script, je n’en montre qu’une partie en dessous]

L’exécutable va se baser sur les informations recueillies par Open Firmware pour charger le noyau XNU, qui va à son tour continuer le boot de Mac OS X.

Et comme les choses sont bien faites, le blessed folder quand Mac OS X est installé se trouve être /System/Library/CoreServices, l’endroit même où se trouve BootX ! Dingue, non ?

Question : est-il possible de modifier le disque de démarrage ?

Oui ! Mac OS Classic et Mac OS X incluent le nécessaire pour modifier la NVRAM. Il est dès lors possible d’en changer les variables graphiquement (voire même en CLI avec Mac OS X) :

Choix d’un disque de démarrage sur un iMac G4 avec Mac OS X Tiger 10.4.11.

Dans l’exemple du dessus, le système de démarrage est Mac OS X sur le disque Macintosh HD, visible dans l’app Préférences Système en haut.

En bas à gauche, on voit bien que la variable boot-device de la NVRAM a changé, la partition contenant le système est spécifiée et non plus l’alias, en l’occurence la partition 10 du 1er disque, ou disque 0.

En bas à droite, on constate que la 10ème partition du disque 0 (disk0s10 en notation BSD) correspond bien à Macintosh HD. La boucle est bouclée !

Donc, ce qu’Open Firmware voit comme :

hd:,\\:tbxi

Se traduit par :

Trouver le fichier bootinfo de type TBXI (=BootX) à l’emplacement /System/Library/CoreServices sur la partition 10 du disque IDE 0 sur le contrôleur ATA de la carte mère du Macintosh.

UEFI

L’utilisation de l’UEFI (et sur les Mac équipés de puces T1 et T2, d’iBoot) pour lancer macOS est décrit par Apple sur son Site Web dédié à la sécurité de ses plateformes.


Pour aller plus loin :

Ce post est une vulgarisation concernant des technologies que j’ai appris à utiliser au fil des années. Des détails techniques ont été omis ou résumés pour en faciliter la compréhension. Pour en savoir plus, voici une liste de publications qui entrent dans le détail des informations évoquées :