Tiefgehende Analyse von Apples Darwin-OS und dem XNU-Kernel
(tansanrao.com)- 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_pagerverwaltet den Swap-Bereich - File Mapping wird über den vnode pager im Kernel verarbeitet
- Der User-Space-Daemon
- 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.