XNU - Das Herz von Mac OS X/Darwin ================================== Das Herzstück eines jeden Betriebsystemes ist der Kernel. Unter Mac OS X (bzw. Darwin) heisst dieser XNU, dies ist ein Akronym und steht für "XNU's not Unix". Da das Grundgerüst von Mac OS X als Open-Source in der Form von Darwin verfügbar ist, lässt sich der Kernel auch individuell übersetzen. Dies ist sowohl unter Darwin (PowerPC- und Intel-Architektur) als auch unter Mac OS X möglich. Um den Kernel übersetzen zu können, sind verschiedene Software-Pakete nötig. - Mac OS X Developer Tools, diese sind von Apple erhältlich (http://developer.apple.com/tools/macosxtools.html) und die eigentliche Toolchain für den Kernel: - cctools - Libstreams - bootstrap_cmds Diese sind entweder direkt, in Form von Tar-Archiven, von der Apple Seite (http://www.opensource.apple.com/darwinsource/10.2.5/) erhältlich oder können aus dem OpenDarwin-CVS ausgecheckt werden. Da einige dieser Pakete der APSL (Apple Public Source License) unterliegen, muss man bei einem Download über die Apple-Seite einen entsprechenden Login anlegen. Die 10.2.5 Version der cctools ist zur Zeit nicht im OpenDarwin CVS vorhanden, so dass diese auf jeden Fall über die Apple-Seite bezogen werden muss. Will man die benötigte Software aus dem CVS-Repository von OpenDarwin auschecken, muss man darauf achten, das man nicht 'HEAD' (welches das Tag für die jeweils aktuelleste Revision ist), sondern mit dem Tag 'OD_APPLE_10_2_5' auscheckt. % cvs -d :pserver:anonymous@anoncvs.opendarwin.org:/Volumes/src/cvs/od login (Passwort Anfrage mit Enter bestätigen, das Passwort is leer) % cvs -d :pserver:anonymous@anoncvs.opendarwin.org:/Volumes/src/cvs/od co -r 10_2_5 src/Libstreams % cvs -d :pserver:anonymous@anoncvs.opendarwin.org:/Volumes/src/cvs/od co -r 10_2_5 src/bootstrap_cmds Der Source-Code für den XNU-Kernel ist auch aus dem OpenDarwin-Repository erhältlich: % cvs -d :pserver:anonymous@anoncvs.opendarwin.org:/Volumes/src/cvs/od co -r 10_2_5 src/xnu Durch das Auschecken ist im aktuellen Verzeichnis, das Verzeichnis 'src' entstanden. Im folgenden wird davon ausgegangen, das dies im Home-Verzeichnis des Benuzters liegt, desweiteren sollte '/usr/local/bin' in der PATH-Variablen vorhanden sein. Als Erstes müssen die Mac OS X Developer Tools installiert werden. Danach kann die Toolchain übersetzt und installiert werden. Begonnen wird mit bootstrap_cmds: % cd ~/src/bootstrap_cmds/relpath.tproj % make % sudo make install dann folgt Libstreams: % cd ~/src/Libstreams % make % sudo make install Da zur Zeit noch noch die Header-Datei 'unistd.h' im Kernel-Framework fehlt, muss diese vor dem Kompilieren der cctools zuerst von /usr/include/sys nach /System/Library/Frameworks/Kernel.framework/Headers/sys/ kopiert werden: % sudo cp /usr/include/sys/unistd.h /System/Library/Frameworks/Kernel.framework/Headers/sys/ Nun können die cctools kompiliert und installiert werden: % cd ~/src/cctools % make RC_OS=macos Bevor 'libkld' (ein Bestandteil der cctools) kompiliert werden kann, muss das enstandene 'seg_hack'-Binary nach '/usr/local/bin' kopiert werden: % sudo cp misc/seg_hack.NEW /usr/local/bin/seg_hack % cd ~/src/cctools/ld/ % make RC_OS=macos % sudo cp static_kld/libkld.a /usr/local/lib/ Damit sichergestellt ist, das libkld.a auch keine Probleme macht, sollte einmal ranlib über die Library laufen gelassen werden: % sudo ranlib /usr/local/lib/libkld.a Nachdem nun der hakelige Teil überstanden ist, ist das eigentliche Übersetzen des Kernels verglichen mit dem der Toolchain recht simpel: % cd ~/src/xnu % make Statt die Default-Konfiguration des Kernels zu kompilieren, besteht auch die Möglichkeit einen Debug-Kernel zu bauen. Statt des einfachen 'make'-Aufrufes, gibt man zusätzlich die Konfiguration an: % make KERNEL_CONFIGS=DEBUG all Der neue Kernel liegt danach in ~/src/xnu/BUILD/obj/RELEASE_$ARCH/, wobei $ARCH entsprechend der Architektur entweder 'I386' oder 'PPC' ist. Ein besonderes Feature ist die Möglichkeit einen 'FAT'-Kernel zu übersetzen. Dieser Kernel lässt sich sowohl auf der I386- wie auch der PPC-Architektur booten. % make ARCH_CONFIGS="PPC I386" exporthdrs all Zum Installieren des neuen Kernels bietet sich das 'kswap.sh'-Skript von Jean-Pierre Mouilleseaux an. Dieses ist unter http://www.opendarwin.org/~jpm/naughty/darwin/kswap.sh erhältlich. Zuerst den neuen Kernel nach '/' kopieren, es bietet sich an dem neuen Kernel ein Suffix wie zum Beispiel '.test' zu geben: % sudo cp ~/src/xnu/BUILD/obj/RELEASE_PPC/mach_kernel /mach_kernel.test Nun kann man kswap.sh aufrufen, was einem das Modifizieren der OpenFirmware (auf der PPC-Architektur) bzw. das Umschreiben der Datei /private/Drivers/i386/System.config/Default.table abnimmt: % ./kswap.sh --test /mach_kernel.test Beim nächsten Boot-Vorgang sollte der neue Kernel gebootet werden. Ob der neue Kernel gebootet wurde, lässt sich leicht anhand der Ausgabe von 'uname' erkennen. Auf dem System des Autors gibt 'uname' aus: % uname -a Darwin sneek 6.5 Darwin Kernel Version 6.5: Tue Apr 22 19:19:36 CEST 2003; fkr:BUILD/obj/RELEASE_I386 x86 i386 Mit Hilfe von 'kswap.sh' kann jederzeit auch der alte Kernel wieder aktiviert werden: % ./kswap.sh --stable Manchem Benutzer von OpenBSD oder NetBSD ist Systrace sicherlich geläufig. Systrace bietet die Möglichkeit zur Laufzeit die System-Calls eines Programmes zu überwachen und diese zu erlauben bzw. zu unterbinden. Detaillierte Informationen zu Systrace finden sich auf http://www.systrace.org/. Der Autor von Systrace, Niels Provos, hat Systrace vor einiger Zeit auf Mac OS X portiert. Damit Systrace funktioniert muss der Kernel das Systrace-Device, '/dev/systrace', zur Verfügung stellen. Einen entsprechenden Kernel-Patch für XNU gibt es auf der Systrace-Webseite, diesen kopiert man in das XNU Source-Verzeichnis und patched damit die Kernel-Sourcen: % cp ~/mach_kernel.diff ~/src/xnu/ % cd ~/src/xnu % patch -p0 < mach_kernel.diff Nach dem Booten des Systrace-fähigen Kernels sollte das Systrace-Device in '/dev' auftauchen: % ls -l /dev/systrace crw-r--r-- 1 root wheel 7, 0 Apr 25 15:57 /dev/systrace Damit Systrace auch genutzt werden kann, müssen die entsprechenden Userland-Programme vorhanden sein. Diese kann man entweder von der Systrace-Webseite runterladen oder via DarwinPorts installieren (siehe Artikel Ausgabe 3/03, "Software installieren aus den DarwinPorts"): % sudo port install systrace % sudo port install gtk-systrace Für Mac OS X-Benutzer gibt es auf den Mac OS X Seiten von Systrace auch ein Cocoa-basiertes Frontend für Systrace, Cocoa-Systrace. http://developer.apple.com/tools/macosxtools.html http://www.apple.com/darwin/ http://www.opendarwin.org/ http://www.opensource.apple.com/darwinsource/10.2.5/ http://www.opendarwin.org/~jpm/naughty/darwin/kswap.sh http://www.systrace.org/ http://www.citi.umich.edu/u/provos/systrace/macosx.html http://www.opendarwin.org/projects/darwinports/