2 points par GN⁺ 2025-04-06 | Aucun commentaire pour le moment. | Partager sur WhatsApp
  • Le système d’exploitation Darwin d’Apple constitue le cœur de type Unix sur lequel reposent les OS modernes d’Apple, comme macOS et iOS
  • Son élément central est le noyau XNU, un noyau hybride dont le nom signifie « X is Not Unix »
  • Il combine l’architecture du microkernel Mach et des éléments de BSD Unix afin d’équilibrer performances et modularité
  • Cet article explique l’évolution structurelle de Darwin et de XNU, depuis les racines de Mach et BSD jusqu’à leur évolution la plus récente sur Apple Silicon
  • Il analyse les composants clés du noyau (IPC, ordonnancement, gestion mémoire, virtualisation, etc.) ainsi que leur adaptation au matériel moderne

Origines du microkernel Mach (1985–1996)

  • Mach a été lancé en 1985 à la Carnegie Mellon University par Richard Rashid et Avie Tevanian
  • Il a été conçu comme un microkernel ne fournissant que les fonctions essentielles afin de réduire la complexité du noyau UNIX
  • Il ne fournit que des fonctions bas niveau comme la gestion mémoire, l’ordonnancement fondé sur les threads et l’IPC par messages, tandis que le système de fichiers, le réseau, etc. sont séparés en serveurs en espace utilisateur
  • Mach 2.5 s’exécutait en espace noyau avec une partie du code noyau BSD afin de compenser les performances
  • Mach 3.0 marque la transition vers un véritable microkernel et influence aussi la gestion mémoire de BSD
  • Mach introduit les notions de tâche (Task) et de thread (Thread), ainsi qu’un modèle efficace de mémoire virtuelle
  • NeXT (fondée par Steve Jobs en 1985) développe l’OS NeXTSTEP sur une base Mach 2.5 + 4.3BSD
  • Le noyau de NeXTSTEP combine Mach et BSD en espace noyau pour former une structure hybride
  • Les pilotes sont développés avec DriverKit, basé sur Objective-C, dans une approche orientée objet
  • Apple rachète NeXT en 1996 et récupère NeXTSTEP ainsi que le noyau XNU fondé sur Mach/BSD
  • Les premières versions de Mac OS X (Rhapsody) sont développées sur la base de la structure du noyau de NeXT

Premières évolutions de Mac OS X (1997–2005)

  • Apple intègre dans XNU le code Mach 3.0 basé sur OSFMK 7.3 et met à jour la couche BSD avec du code FreeBSD et 4.4BSD
  • Afin d’améliorer les performances et d’élargir la prise en charge matérielle, Apple conserve une structure hybride intégrant les fonctions de BSD et de Mach
  • Introduction du nouveau framework de pilotes I/O Kit : basé sur C++ plutôt que sur Objective-C, avec optimisation des performances et prise en charge du hot-plug
  • Résumé des principales caractéristiques par version :
    • 10.1 Puma (2001) : prise en charge des threads temps réel, amélioration des performances
    • 10.2 Jaguar (2002) : introduction d’IPv6, IPSec, Bonjour et de la journalisation HFS+
    • 10.3 Panther (2003) : améliorations du noyau basées sur FreeBSD 5, introduction du fine-grained locking pour la prise en charge du multicœur
  • XNU prend en charge PowerPC en standard tout en conservant du code de support x86 afin de préparer une future transition
  • 10.4 Tiger (2005) : obtention de la certification UNIX 03, préparation de la transition vers Intel, introduction du système d’événements kqueue/kevent

Période 64 bits, multicœur et iPhone OS (2005–2010)

  • 10.5 Leopard (2007) :
    • prise en charge de x86_64 et possibilité d’utiliser des pilotes 64 bits
    • renforcement des fonctions de sécurité et de débogage avec ASLR, sandbox, DTrace, etc.
    • dernier support officiel de PowerPC
  • iPhone OS 1 (2007) :
    • basé sur Darwin 9, avec portage de XNU sur ARM
    • introduction du mécanisme Jetsam pour faire face au manque de mémoire
    • sandboxing généralisé des applications et signature de code obligatoire
  • 10.6 Snow Leopard (2009) :
    • Intel uniquement, avec prise en charge complète du noyau 64 bits
    • introduction de Grand Central Dispatch : framework de parallélisation des tâches en espace utilisateur collaborant avec le noyau
    • intégration d’OpenCL et prise en charge du calcul GPU
  • iOS 4 (2010) :
    • introduction du multitâche et de l’ordonnancement fondé sur les priorités (distinction arrière-plan/premier plan)

Modernisation de macOS et iOS (2011–2020)

  • 10.8~10.9 (2012–2013) :
    • introduction de Compressed Memory pour optimiser l’utilisation de la RAM
    • renforcement des économies d’énergie CPU avec Timer Coalescing
    • évolution de l’ordonnancement centré sur l’efficacité énergétique avec App Nap, QoS, etc.
  • 10.10~10.11 (2014–2015) :
    • introduction de SIP (System Integrity Protection) : même les privilèges root ne permettent pas de modifier les fichiers système
    • extension de XNU à divers appareils comme watchOS et tvOS
    • prise en charge d’ARM64 et début des préparatifs pour l’abandon de l’ARM 32 bits
  • 10.12~10.14 (2016–2018) :
    • transition vers APFS (Apple File System)
    • prise en charge des snapshots, du clonage et du chiffrement
    • renforcement de la sécurité des kext : approbation utilisateur requise et vérification de signature de code renforcée
  • 10.15 Catalina (2019) :
    • introduction de DriverKit : exécution des pilotes en espace utilisateur (retour à la philosophie microkernel)
    • séparation du volume système en lecture seule pour renforcer la sécurité

Ère Apple Silicon (2020–aujourd’hui)

  • macOS 11 Big Sur (2020) :

    • prise en charge d’Apple Silicon (M1) basé sur ARM64
    • prise en charge de l’ordonnancement big.LITTLE : répartition des threads entre cœurs d’efficacité et cœurs de performance selon la QoS
    • l’architecture Mach VM convient bien à l’architecture mémoire unifiée
  • Renforcement de la sécurité et de la virtualisation :

    • prise en charge de fonctions de sécurité matérielle ARM comme PAC (authentification de pointeurs) et MTE (memory tagging)
    • introduction d’un nouveau framework de virtualisation fondé sur les fonctions d’hyperviseur d’Apple Silicon
    • possibilité d’exécuter des VM légères pour les développeurs sur macOS (contrôle en espace utilisateur)
  • Structure de plateforme unifiée :

    • XNU est utilisé comme noyau de toutes les plateformes Apple : macOS, iOS, watchOS, tvOS, bridgeOS, visionOS, etc.
    • grâce à l’abstraction de plateforme de Mach, il peut s’adapter facilement à diverses architectures CPU

Résumé des grandes étapes de XNU

  • 1989 - NeXTSTEP 1.0 - introduction du modèle hybride XNU avec Mach 2.5 + BSD
  • 1996 - Apple rachète NeXT - début du développement de Rhapsody sur une base Mach 3.0 + FreeBSD
  • 2001 - Mac OS X 10.0 - structuration de l’architecture du noyau XNU et premières améliorations de performances
  • 2005 - 10.4 Tiger - certification UNIX, préparation de la transition vers Intel
  • 2007 - 10.5 Leopard - prise en charge du 64 bits, renforcement des fonctions de sécurité, arrivée d’iPhone OS
  • 2009 - 10.6 Snow Leopard - transition complète vers Intel et introduction de GCD
  • 2011 - 10.7 Lion - généralisation du noyau 64 bits, extension du sandboxing
  • 2013 - 10.9 Mavericks - introduction de la compression mémoire et de l’ordonnancement QoS
  • 2015 - 10.11 El Capitan - introduction de SIP, extension à des appareils comme watchOS
  • 2017 - 10.13 High Sierra - APFS par défaut, sécurité Kext renforcée
  • 2019 - 10.15 Catalina - exécution des pilotes en espace utilisateur avec DriverKit
  • 2020 - 11 Big Sur - prise en charge d’Apple Silicon, introduction d’une nouvelle architecture de virtualisation
  • 2022 - 13 Ventura - amélioration de l’ordonnancement pour les cœurs haute performance comme ceux du M1 Max
  • 2024 - 14 Sonoma - optimisations pour M2/M3 et prise en charge de Memory Tagging

Architecture et conception du noyau XNU

Conception de noyau hybride : intégration de Mach + BSD

  • XNU adopte une architecture de noyau hybride réunissant les caractéristiques d’un microkernel (Mach) et d’un noyau monolithique (BSD)
  • Mach abstrait et modularise les fonctions bas niveau (threads, mémoire, IPC, etc.), tandis que BSD exécute directement en espace noyau l’ensemble des appels système UNIX et des API
  • BSD et Mach sont liés dans un unique binaire noyau et s’exécutent dans le même espace d’adressage
  • À l’intérieur du noyau, les fonctions Mach et BSD s’appellent directement sans messages, et les appels système UNIX sont traités à un niveau de performance comparable à celui d’autres noyaux Unix
  • Exemple : lors d’un appel système read(), le code du système de fichiers BSD s’exécute directement dans le noyau

Rôle de Mach

  • Fournit l’infrastructure centrale du noyau : threads, gestion des tâches, changements de contexte, files d’ordonnancement, timers, etc.
  • Fournit un IPC par messages via les ports Mach (avec prise en charge du partage mémoire entre processus et du transfert de gros buffers)
  • Met en œuvre des fonctions avancées de gestion de la mémoire virtuelle comme les objets mémoire, l’optimisation copy-on-write et l’abstraction de l’espace d’adressage

Rôle de BSD

  • Fournit les fonctions UNIX : processus et PID, signaux, identifiants utilisateur, API POSIX, système de fichiers, pile réseau, IPC UNIX, etc.
  • Dérive du code BSD basé sur FreeBSD, avec aussi des fonctions issues d’OpenBSD et NetBSD
  • Met en œuvre les politiques de sécurité : framework de sécurité (KAuth, MAC), sandbox, SIP, vérification de signature de code, etc.
  • Implémentation des appels système : fork() effectue par exemple la duplication VM dans Mach et la duplication des descripteurs de fichiers dans BSD
  • Prend en charge la majorité des fonctions UNIX comme le VFS, le réseau, le traitement des signaux et les threads POSIX

I/O Kit

  • Framework de pilotes orienté objet s’exécutant en espace noyau (utilisant un sous-ensemble embarqué de C++)
  • Définit une hiérarchie des périphériques, que chaque pilote implémente par héritage
  • Fournit une interface user client accessible depuis l’espace utilisateur
  • Utilise les fonctions Mach pour la synchronisation noyau et le contrôle des threads, et s’appuie sur BSD pour les pilotes de système de fichiers et de réseau
  • Les pilotes peuvent être chargés dynamiquement en tant que kext et sont chargés en mémoire noyau au format Mach-O

Mach IPC et transmission de messages

  • Les ports Mach sont le principal mécanisme d’IPC entre le noyau et l’espace utilisateur, ou entre processus utilisateur
  • Chaque processus peut être contrôlé via des ports Mach, et des démons système comme launchd contrôlent les processus par ce biais
  • Des fonctions avancées de macOS comme Grand Central Dispatch ou XPC sont implémentées sur la base des messages Mach
  • Les messages Mach disposent d’un système de droits sur les ports qui renforce la sécurité, et permettent le transfert de ports ainsi que de mémoire partagée
  • MIG (Mach Interface Generator) sert à générer automatiquement le code RPC par messages entre le noyau et l’utilisateur
  • DriverKit implémente, sur la base de Mach IPC, la communication entre le noyau et les pilotes en espace utilisateur

Ordonnanceur et gestion des threads

  • Issu d’un ordonnanceur round-robin fondé sur les priorités et basé sur Mach
  • Chaque CPU dispose de sa propre Run Queue, et les threads sont ordonnancés selon leur priorité
  • Après l’introduction d’iOS, des politiques d’ordonnancement tenant compte du rôle des applications (arrière-plan/premier plan) sont apparues
  • Ordonnancement fondé sur les classes QoS (Quality of Service) : ajustement des priorités selon le type de tâche, par exemple interactive ou en arrière-plan
  • Sur Apple Silicon, les threads sont affectés aux cœurs d’efficacité ou de haute performance selon la QoS
  • Les threads temps réel (audio, etc.) sont exécutés en priorité via des files temps réel, et l’ordonnancement par deadline est pris en charge depuis macOS 10.4
  • Coopération avec la gestion énergétique : thread idle, regroupement des timers, entrée en veille, etc., pour optimiser les performances sur mobile

Gestion mémoire et mémoire virtuelle

  • Mach VM constitue le cœur du système mémoire de XNU, avec une conception puissante et flexible
  • L’espace d’adressage virtuel repose sur le copy-on-write, ce qui permet une duplication mémoire efficace lors de fork()
  • Structure des objets mémoire (Memory Object) et des pagers (Pager) :
    • le démon en espace utilisateur dynamic_pager gère la zone de swap
    • le mapping de fichiers est traité dans le noyau via le vnode pager
  • À partir de Mavericks, introduction de la mémoire compressée : en cas de manque de mémoire, les pages sont compressées au lieu d’être immédiatement swapées sur disque
  • pmap : couche dépendante de la machine qui gère la mémoire physique et les tables de pages pour chaque architecture
  • Le noyau possède son propre espace d’adressage et certaines zones sont définies comme mémoire fixée (wired)
  • macOS renforce la sécurité mémoire avec des guard pages de débogage, des allocations zero-fill et des protections de segmentation
  • Mach VM traite efficacement le partage de frameworks, entre autres, via la mémoire partagée et les réglages d’héritage
  • Sur Apple Silicon, le GPU et la mémoire partagent un espace unifié, ce qui permet à Mach VM d’optimiser les allocations selon les caractéristiques mémoire

Prise en charge de la virtualisation

  • XNU ne disposait pas initialement de fonctions d’hyperviseur, mais la prise en charge de la virtualisation commence avec Hypervisor.framework à partir d’OS X 10.10
  • Sur Intel, cela permet d’exécuter des VM en espace utilisateur en exploitant VT-x
  • Sur Apple Silicon à base ARM, Virtualization.framework exploite les fonctions de virtualisation EL2
  • L’hyperviseur interne du noyau prend en charge la mémoire virtuelle, le traitement des traps vCPU, l’ordonnancement, etc.
  • Il s’appuie sur la structure des threads XNU et des tâches Mach pour traiter les vCPU comme des threads hôtes
  • macOS fournit aussi des fonctions d’émulation x86 comme Rosetta 2, avec traduction des appels système et compatibilité ABI
  • Depuis iOS 15, la virtualisation est également autorisée sur iOS sous une forme limitée (mode développeur requis)

Architecture de sécurité informatique

  • Secure Enclave :
    • sous-système de sécurité indépendant intégré au SoC Apple
    • exécute un microkernel distinct nommé sepOS, protégeant les données biométriques, les clés de chiffrement, etc.
    • conserve un traitement de sécurité isolé même si le noyau principal est compromis
  • Exclaves :
    • nouvelle zone d’isolation introduite à partir de macOS 14.4 et iOS 17
    • sépare hors du noyau principal des ressources sensibles comme l’authentification Apple ID, les buffers audio ou les données de capteurs
    • pilotée par des kext et frameworks dédiés comme ExclaveKextClient.kext
    • même si le noyau est compromis, la zone exclave reste protégée indépendamment
  • Le terme enclave renvoie à une zone incluse dans le système, tandis qu’exclave désigne une zone séparée reliée de l’extérieur au système

Conclusion

  • XNU est un noyau à l’architecture hybride pragmatique, conciliant les avantages du microkernel et du noyau monolithique
  • La couche d’abstraction de Mach permet les transitions entre architectures CPU et l’extension du système, tandis que BSD fournit la compatibilité POSIX et un environnement Unix stable
  • Apple s’appuie sur Mach IPC pour déplacer certaines fonctions vers l’espace utilisateur quand nécessaire, tout en conservant des liaisons directes dans le noyau pour l’efficacité
  • Avec son architecture multicouche — pilotes (DriverKit en espace utilisateur), virtualisation (Hypervisor.framework), ordonnanceur (QoS), gestion mémoire (Compressed Memory) — le système répond avec souplesse aux exigences modernes
  • Darwin et XNU, partis de NeXTSTEP, sont devenus le cœur de centaines de millions d’appareils Apple et continuent d’évoluer

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.