2 Punkte von GN⁺ 2025-04-06 | Noch keine Kommentare. | Auf WhatsApp teilen
  • Apples Betriebssystem Darwin ist die Unix-basierte Kernkomponente, auf der Apples moderne Betriebssysteme wie macOS und iOS aufbauen
  • Das Herzstück ist der XNU-Kernel, ein Hybridkernel mit dem Namen „X is Not Unix“
  • Er kombiniert die Struktur des Mach-Mikrokernels mit Elementen von BSD Unix und setzt damit ein ausgewogenes Verhältnis zwischen Leistung und Modularität um
  • Dieser Artikel erklärt die strukturelle Entwicklung von Darwin und XNU – von den Wurzeln in Mach und BSD bis zur neuesten Evolution auf Apple Silicon
  • Analysiert werden die zentralen Kernel-Bestandteile (IPC, Scheduling, Speicherverwaltung, Virtualisierung usw.) sowie die Anpassung an moderne Hardware

Ursprung des Mach-Mikrokernels (1985–1996)

  • Mach wurde 1985 an der Carnegie Mellon University von Richard Rashid und Avie Tevanian gestartet
  • Er wurde als Mikrokernel entworfen, der nur Kernfunktionen bereitstellt, um die Komplexität des UNIX-Kernels zu verringern
  • Er bietet nur Low-Level-Funktionen wie Speicherverwaltung, threadbasiertes Scheduling und nachrichtenbasiertes IPC; Dateisystem, Netzwerk usw. wurden in User-Space-Server ausgelagert
  • Mach 2.5 lief zusammen mit Teilen des BSD-Kernelcodes im Kernel-Space, um die Leistung zu verbessern
  • Mach 3.0 wechselte zu einem echten Mikrokernel und beeinflusste auch die Speicherverwaltung von BSD
  • Mach führte die Konzepte von Task und Thread ein und implementierte ein effizientes Modell für virtuellen Speicher
  • NeXT (1985 von Steve Jobs gegründet) entwickelte das Betriebssystem NeXTSTEP auf Basis von Mach 2.5 + 4.3BSD
  • Der Kernel von NeXTSTEP kombinierte Mach und BSD im Kernel-Space zu einer hybriden Struktur
  • Treiber wurden mit dem Objective-C-basierten DriverKit entwickelt und verfolgten einen objektorientierten Ansatz
  • Apple übernahm 1996 NeXT und erhielt damit NeXTSTEP sowie den auf Mach/BSD basierenden XNU-Kernel
  • Frühe Versionen von Mac OS X (Rhapsody) wurden auf Basis der Kernel-Struktur von NeXT entwickelt

Frühe Evolution von Mac OS X (1997–2005)

  • Apple integrierte Mach-3.0-Code auf Basis von OSFMK 7.3 in XNU und aktualisierte die BSD-Schicht mit Code aus FreeBSD und 4.4BSD
  • Um Leistung zu verbessern und den Hardware-Support auszuweiten, blieb die hybride Struktur mit integrierten Funktionen von BSD und Mach erhalten
  • Einführung des neuen Treiber-Frameworks I/O Kit: statt Objective-C auf C++ basierend, für Performance-Optimierung und Hot-Plugging-Support
  • Zusammenfassung der wichtigsten Versionsmerkmale:
    • 10.1 Puma (2001): Unterstützung für Echtzeit-Threads, Leistungsverbesserungen
    • 10.2 Jaguar (2002): Einführung von IPv6, IPSec, Bonjour und HFS+-Journaling
    • 10.3 Panther (2003): Kernel-Verbesserungen auf Basis von FreeBSD 5, Einführung von Fine-Grained Locking für Multicore-Support
  • XNU unterstützte standardmäßig PowerPC, behielt aber auch x86-Support-Code bei, um einen späteren Wechsel vorzubereiten
  • 10.4 Tiger (2005): Erlangte die UNIX-03-Zertifizierung, legte die Grundlage für den Intel-Wechsel und führte das Event-System kqueue/kevent ein

64 Bit, Multicore und die iPhone-OS-Ära (2005–2010)

  • 10.5 Leopard (2007):
    • Unterstützung für x86_64 und 64-Bit-Treiber
    • Ausbau von Sicherheits- und Debugging-Funktionen wie ASLR, Sandbox und DTrace
    • Letzte offizielle Unterstützung für PowerPC
  • iPhone OS 1 (2007):
    • Basierend auf Darwin 9, Portierung von XNU auf ARM
    • Einführung des Jetsam-Mechanismus zur Reaktion auf Speichermangel
    • Verpflichtende App-Sandbox für alle Apps und obligatorische Code-Signierung
  • 10.6 Snow Leopard (2009):
    • Nur noch Intel, vollständige Unterstützung für einen 64-Bit-Kernel
    • Einführung von Grand Central Dispatch: ein User-Space-Framework zur Task-Parallelisierung in Zusammenarbeit mit dem Kernel
    • Integration von OpenCL und Unterstützung für GPU-Computing
  • iOS 4 (2010):
    • Einführung von Multitasking und prioritätsbasiertem Scheduling (Unterscheidung zwischen Hintergrund und Vordergrund)

Modernisierung von macOS und iOS (2011–2020)

  • 10.8~10.9 (2012–2013):
    • Einführung von Compressed Memory zur Optimierung der RAM-Nutzung
    • Stärkere CPU-Energieeinsparung durch Timer Coalescing
    • Weiterentwicklung des Schedulings mit Fokus auf Energieeffizienz durch App Nap, QoS usw.
  • 10.10~10.11 (2014–2015):
    • Einführung von SIP (System Integrity Protection): Selbst mit Root-Rechten können Systemdateien nicht verändert werden
    • Schuf die Grundlage dafür, XNU auf verschiedene Geräte wie watchOS und tvOS auszuweiten
    • Beginn der ARM64-Unterstützung und Vorbereitung auf das Auslaufen von 32-Bit-ARM
  • 10.12~10.14 (2016–2018):
    • Umstellung des Dateisystems auf APFS (Apple File System)
    • Unterstützung für Snapshots, Cloning und Verschlüsselung
    • Verschärfte Kext-Sicherheit: Benutzerfreigabe erforderlich, strengere Prüfung der Code-Signierung
  • 10.15 Catalina (2019):
    • Einführung von DriverKit: Treiber laufen im User Space (Rückkehr zur Mikrokernel-Philosophie)
    • Höhere Sicherheit durch Trennung des System-Volumes als schreibgeschützter Bereich

Apple-Silicon-Ära (2020–heute)

  • macOS 11 Big Sur (2020):

    • Unterstützung für ARM64-basiertes Apple Silicon (M1)
    • Unterstützung für big.LITTLE-CPU-Scheduling: Verteilung auf Effizienz- und Performance-Kerne auf Basis von QoS
    • Die Mach-VM-Struktur eignet sich gut für Unified-Memory-Architekturen
  • Stärkung von Sicherheit und Virtualisierung:

    • Unterstützung für ARM-Hardware-Sicherheitsfunktionen wie PAC (Pointer Authentication) und MTE (Memory Tagging)
    • Einführung eines neuen Virtualisierungs-Frameworks auf Basis der Hypervisor-Funktionen von Apple Silicon
    • Leichtgewichtige VMs für Entwickler können unter macOS ausgeführt werden (Steuerung im User Space)
  • Integrierte Plattformstruktur:

    • XNU wird als Kernel für alle Apple-Plattformen verwendet, darunter macOS, iOS, watchOS, tvOS, bridgeOS und visionOS
    • Dank der Plattformabstraktion von Mach ist eine einfache Anpassung an verschiedene CPU-Architekturen möglich

Zusammenfassung der wichtigsten Stationen von XNU

  • 1989 - NeXTSTEP 1.0 - Einführung des XNU-Hybrids aus Mach 2.5 + BSD
  • 1996 - Apple übernimmt NeXT - Beginn der Entwicklung von Rhapsody auf Basis von Mach 3.0 + FreeBSD
  • 2001 - Mac OS X 10.0 - Etablierung der XNU-Kernelstruktur und erste Leistungsverbesserungen
  • 2005 - 10.4 Tiger - UNIX-Zertifizierung, Vorbereitung auf den Intel-Wechsel
  • 2007 - 10.5 Leopard - 64-Bit-Unterstützung, Ausbau von Sicherheitsfunktionen, Start von iPhone OS
  • 2009 - 10.6 Snow Leopard - Vollständiger Wechsel zu Intel und Einführung von GCD
  • 2011 - 10.7 Lion - Erzwingung des 64-Bit-Kernels, Ausbau von Sandboxing
  • 2013 - 10.9 Mavericks - Einführung von Speicherkomprimierung und QoS-Scheduling
  • 2015 - 10.11 El Capitan - Einführung von SIP, Ausweitung auf Geräte wie watchOS
  • 2017 - 10.13 High Sierra - APFS standardmäßig aktiviert, stärkere Kext-Sicherheit
  • 2019 - 10.15 Catalina - Treiber laufen mit DriverKit im User Space
  • 2020 - 11 Big Sur - Unterstützung für Apple Silicon, Einführung einer neuen Virtualisierungsstruktur
  • 2022 - 13 Ventura - Verbesserungen beim Scheduling für Hochleistungskerne wie im M1 Max
  • 2024 - 14 Sonoma - Optimierungen für M2/M3 und Unterstützung für Memory Tagging

XNU-Kernelstruktur und Design

Hybridkernel-Design: Integration von Mach + BSD

  • XNU besitzt eine Hybridkernel-Struktur, die sowohl Eigenschaften eines Mikrokernels (Mach) als auch eines monolithischen Kernels (BSD) vereint
  • Mach abstrahiert und modularisiert Low-Level-Funktionen (Threads, Speicher, IPC usw.), während BSD die vollständigen UNIX-System-Calls und APIs direkt im Kernel-Space ausführt
  • BSD und Mach sind zu einem einzigen Kernel-Binary gelinkt und laufen im selben Adressraum
  • Innerhalb des Kernels rufen Mach- und BSD-Funktionen einander direkt ohne Nachrichtenmechanismus auf; UNIX-System-Calls werden daher mit einer Leistung auf dem Niveau anderer Unix-Kernel verarbeitet
  • Beispiel: Beim Aufruf des System-Calls read() wird der BSD-Dateisystemcode direkt im Kernel ausgeführt

Rolle von Mach

  • Stellt die zentrale Kernel-Infrastruktur für Threads, Task-Verwaltung, Context Switching, Scheduling-Queues, Timer usw. bereit
  • Bietet nachrichtenbasiertes IPC über Mach-Ports (einschließlich Shared Memory zwischen Prozessen und Übertragung großer Buffer)
  • Implementiert fortgeschrittene Funktionen für virtuellen Speicher wie Memory Objects, Copy-on-Write-Optimierung und Adressraumabstraktion

Rolle von BSD

  • Bietet UNIX-Funktionen wie Prozesse und PID, Signale, User IDs, POSIX-APIs, Dateisysteme, Netzwerk-Stack und UNIX-IPC
  • Stammt aus BSD-Code auf FreeBSD-Basis und enthält auch Funktionen aus OpenBSD/NetBSD
  • Implementiert Sicherheitsrichtlinien wie Security-Frameworks (KAuth, MAC), Sandbox, SIP und Prüfung der Code-Signierung
  • Implementierung von System-Calls: fork() führt z. B. die VM-Duplizierung in Mach und die Duplizierung der File Descriptors in BSD aus
  • Verantwortlich für die meisten UNIX-Funktionen wie Dateisystem (VFS), Netzwerk, Signalverarbeitung und POSIX-Threads

I/O Kit

  • Objektorientiertes Treiber-Framework, das im Kernel-Space läuft (unter Verwendung einer Embedded-Subset-Variante von C++)
  • Definiert eine Gerätehierarchie, die von einzelnen Treibern per Vererbung implementiert wird
  • Bietet User-Client-Schnittstellen für den Zugriff aus dem User Space
  • Nutzt Mach-Funktionen für Kernel-Synchronisierung und Thread-Steuerung; Dateisystem- und Netzwerktreiber sind mit BSD verbunden
  • Treiber können als Kext dynamisch geladen und im Mach-O-Format in den Kernel-Speicher geladen werden

Mach-IPC und Nachrichtenübermittlung

  • Mach-Ports sind der zentrale IPC-Mechanismus zwischen Kernel und User Space sowie zwischen User-Prozessen
  • Jeder Prozess kann über Mach-Ports gesteuert werden; System-Daemons wie launchd kontrollieren Prozesse über diese Ports
  • Fortgeschrittene macOS-Funktionen wie Grand Central Dispatch und XPC basieren auf Mach-Nachrichten
  • Mach-Nachrichten bieten dank des Port-Rechtesystems hohe Sicherheit; auch Port-Übertragung und Shared-Memory-Transfer sind möglich
  • MIG (Mach Interface Generator) wird verwendet, um RPC-Code auf Nachrichtenbasis zwischen Kernel und User automatisch zu erzeugen
  • DriverKit implementiert die Kommunikation zwischen Kernel und User-Space-Treibern auf Basis von Mach-IPC

Scheduler und Thread-Verwaltung

  • Entwickelte sich aus einem prioritätsbasierten Round-Robin-Scheduler auf Mach-Basis
  • Jede CPU besitzt eine eigene Run Queue, und Threads werden prioritätsbasiert eingeplant
  • Seit der Einführung von iOS gibt es Scheduling-Richtlinien je nach App-Rolle (Hintergrund/Vordergrund)
  • QoS-basiertes Scheduling nach Klassen (Quality of Service): Prioritäten werden abhängig von der Art der Aufgabe wie Benutzerinteraktion oder Hintergrundarbeit angepasst
  • Auf Apple Silicon werden Threads abhängig von QoS Effizienz- oder Hochleistungskernen zugewiesen
  • Echtzeit-Threads (z. B. Audio) werden bevorzugt über Echtzeit-Queues ausgeführt; seit macOS 10.4 wird Deadline-Scheduling unterstützt
  • Zusammenarbeit mit dem Power Management: Optimierung mobiler Leistung durch Idle-Threads, Timer-Zusammenlegung und Wechsel in Energiesparzustände

Speicherverwaltung und virtueller Speicher

  • Mach VM ist die Kernkomponente des Speichersystems von XNU und besitzt ein leistungsfähiges, flexibles Design
  • Der virtuelle Adressraum basiert auf Copy-on-Write, wodurch bei fork() eine effiziente Speicherduplizierung möglich ist
  • Struktur aus Memory Objects und Pagern:
    • Der User-Space-Daemon dynamic_pager verwaltet den Swap-Bereich
    • File Mapping wird über den vnode pager im Kernel verarbeitet
  • Seit Mavericks gibt es komprimierten Speicher: Bei Speichermangel werden Seiten komprimiert statt direkt auf Disk ausgelagert
  • pmap: die maschinenabhängige Schicht zur Verwaltung von physischem Speicher und Seitentabellen je Architektur
  • Der Kernel besitzt einen separaten Adressraum; einige Bereiche sind als fester (wired) Speicher markiert
  • macOS stärkt die Speichersicherheit mit Guard Pages für Debugging, Zero-Fill-Allokation und Segmentierungsschutz
  • Mach VM verarbeitet Framework-Sharing usw. effizient über Shared Memory und Inheritance-Einstellungen
  • Auf Apple Silicon sind GPU und Speicherraum integriert, sodass Mach VM Zuweisungen anhand der Speichereigenschaften optimieren kann

Unterstützung für Virtualisierung

  • XNU besaß anfangs keine Hypervisor-Funktionalität, unterstützt aber seit OS X 10.10 Virtualisierung über Hypervisor.framework
  • Auf Intel-Basis kann damit VT-x genutzt werden, um VMs im User Space auszuführen
  • Auf ARM-basiertem Apple Silicon werden über Virtualization.framework EL2-Virtualisierungsfunktionen genutzt
  • Der interne Kernel-Hypervisor übernimmt virtuellen Speicher, vCPU-Trap-Verarbeitung, Scheduling usw.
  • XNU nutzt seine Thread- und Mach-Task-Struktur, um vCPUs als Host-Threads zu behandeln
  • macOS bietet auch x86-Emulationsfunktionen wie Rosetta 2 sowie Syscall-Translation und ABI-Kompatibilität
  • Seit iOS 15 ist Virtualisierung in begrenzter Form auch auf iOS erlaubt (Developer Mode erforderlich)

Sicherheitsarchitektur für Computing

  • Secure Enclave:
    • Eigenständiges Sicherheitssubsystem, das in Apple-SoCs integriert ist
    • Führt einen separaten Mikrokernel namens sepOS aus und schützt biometrische Daten, kryptografische Schlüssel usw.
    • Selbst bei einer Kompromittierung des Hauptkernels bleibt die isolierte Sicherheitsverarbeitung erhalten
  • Exclaves:
    • Neue Isolationsbereiche, eingeführt ab macOS 14.4 und iOS 17
    • Trennen sensible Ressourcen wie Apple-ID-Authentifizierung, Audio-Buffer und Sensordaten in einen Bereich außerhalb des Hauptkernels aus
    • Gesteuert über dedizierte Kexts und Frameworks wie ExclaveKextClient.kext
    • Auch bei einer Kompromittierung des Kernels bleibt der Exclave-Bereich unabhängig geschützt
  • Das Konzept spiegelt wider, dass eine enclave ein im System enthaltener Bereich ist, während eine exclave ein angebundener, abgetrennter Bereich außerhalb davon ist

Fazit

  • XNU ist ein Kernel mit einer praktischen Hybridstruktur, die die Vorteile von Mikrokernel und monolithischem Kernel miteinander abwägt
  • Die Abstraktionsschicht von Mach ermöglicht den Wechsel zwischen verschiedenen CPU-Architekturen und die Erweiterung des Systems, während BSD POSIX-Kompatibilität und eine stabile Unix-Umgebung bereitstellt
  • Apple trennt Funktionen bei Bedarf über Mach-IPC in den User Space aus, während der Kernel intern aus Effizienzgründen direkt gekoppelt bleibt
  • Auf Basis einer mehrschichtigen Architektur mit Treibern (User-Space-DriverKit), Virtualisierung (Hypervisor.framework), Scheduler (QoS) und Speicherverwaltung (Compressed Memory) reagiert das System flexibel auf moderne Anforderungen
  • Darwin und XNU entwickelten sich von NeXTSTEP zum Kern von Hunderten Millionen Apple-Geräten und entwickeln sich weiter

Noch keine Kommentare.

Noch keine Kommentare.