www.wikidata.de-de.nina.az
Ein Systemaufruf auch Systemcall von englisch system call oder kurz Syscall ist in der Computertechnik eine von Anwendungsprogrammen benutzte Methode um vom Betriebssystem bereitgestellte Funktionalitaten auszufuhren wie etwa das Lesen einer Datei Dabei wird die Kontrolle vom Programm an den Kernel ubergeben 1 Inhaltsverzeichnis 1 Details 2 Bibliotheksfunktionen 3 Implementierung 3 1 Linux 3 2 Unix und Unix Varianten 3 3 Windows 3 4 Commodore 3 5 IBM System 360 4 EinzelnachweiseDetails BearbeitenIn modernen Computersystemen z B der IA 32 Architektur von Intel lauft der Kernel also der Betriebssystemkern im so genannten privilegierten Ring 0 auch Kernel Modus genannt und hat damit Zugriff auf den kompletten Befehlssatz der CPU und den gesamten Speicherbereich Aus Sicherheitsgrunden laufen normale Benutzerprozesse dagegen in den unprivilegierten Ringen 1 bis 3 Benutzer Modus in denen ihnen weniger Befehle zur Verfugung stehen und sie daher gewisse Aufgaben nicht direkt erledigen konnen Muss ein im Benutzer Modus laufender Prozess eine Aufgabe erfullen die nur in einem hoher privilegierten Ring moglich ist wie z B der Zugriff auf die Festplatte oder andere Hardware kann er dies dem Kernel durch einen Systemaufruf mitteilen und so einen Kontextwechsel veranlassen Dabei gibt der Prozess die Kontrolle uber die CPU an den Kernel ab und wird so lange unterbrochen bis die Anfrage komplett bearbeitet ist Nach dem Systemaufruf gibt der Kernel die CPU wieder an den Prozess im Benutzer Modus ab und fuhrt den Programmcode an der Stelle fort an der der Kontextwechsel zuvor gefordert wurde Zu keiner Zeit verlasst der Prozess seinen unprivilegierten Ring und kann so auch nicht Gefahr laufen andere Prozesse oder gar die Stabilitat des Systemkernels selbst zu gefahrden da nur vertrauenswurdiger Code aus dem Kernel im privilegierten Modus ausgefuhrt wird Ein Systemaufruf kann sowohl dafur zustandig sein Informationen an die Hardware den Kernel selbst oder andere Prozesse zu schicken als auch solche zu lesen Dafur ist es manchmal notwendig Daten aus dem privaten Speicherbereich des Kernels auf den ein normaler Prozess keinen Zugriff hat in den Adressbereich eines Prozesses zu kopieren damit der Prozess auch nach dem Aufruf noch Zugang zu den Daten hat und mit den Ergebnissen seiner Anfrage uberhaupt etwas anfangen kann Auch dies ist eine Folge der strikten Trennung zwischen Kernel Modus und Benutzer Modus Alle POSIX kompatiblen Betriebssysteme mussen bestimmte Aufrufe implementieren damit eine gewisse Portabilitat zwischen den Systemen gewahrleistet ist Viele Hersteller fugen dem Standard aber auch eigene Erweiterungen hinzu um dem Programmierer zusatzliche Moglichkeiten zu eroffnen Im aktuellen Linux Kernel 4 4 LTS fur die x86 Architektur sind momentan 376 Aufrufe definiert 2 Die Anzahl der Systemaufrufe in Microsoft Windows Vista betragt laut inoffiziellen Quellen 360 3 Bibliotheksfunktionen BearbeitenDie meisten Systeme stellen eine Programmierschnittstelle API fur Systemaufrufe in Form von Bibliotheksfunktionen zur Verfugung die es einem Programmierer erleichtern Arbeiten zu erledigen die einen erweiterten Zugriff auf den Befehlssatz der CPU erfordern Haufig verwendete Bibliotheksfunktionen beispielsweise unter POSIX die auf Systemaufrufen basieren sind unter anderem die Dateiverarbeitungsfunktionen open close read und write sowie exec fork oder exit Diese konnen vom Programmierer wie normale Benutzer Modus Funktionen genutzt werden fuhren aber unbemerkt im Hintergrund einen Kontextwechsel durch Die Abkapselung der Systemaufrufe uber eine API befreit den Programmierer vollstandig von Uberlegungen uber die interne Funktionsweise des Betriebssystems oder der Hardware und erlaubt eine abstraktere Softwareentwicklung Die meisten dieser POSIX Funktionen haben aquivalente Entsprechungen unter Win32 time unter POSIX entspricht beispielsweise GetLocalTime unter Win32 4 Implementierung BearbeitenDie Implementierung von Systemaufrufen hangt stark von der verwendeten Hardware der Architektur und letztlich auch dem benutzten Betriebssystem ab In der Regel wird heute ein Systemaufruf mit Softwareinterrupts oder anderen Spezialinstruktionen der CPU realisiert Bei alteren Systemen findet meist einfach nur ein Sprung an eine fest definierte Adresse statt an der der Systemaufruf oder ein Sprungbefehl zu diesem implementiert ist Fur einen Programmierer der die zur Verfugung gestellte Programmierschnittstelle des Betriebssystems nutzt ist die Implementation von Systemcalls irrelevant In den Beispielen wird eine geoffnete Datei mit dem Dateideskriptor Handle 15 geschlossen Linux Bearbeiten Hauptartikel Liste der Linux Systemaufrufe Der Linux Kernel beherbergt eine Liste aller ihm bekannten Systemaufrufe die so genannte System Call Table Jedem Systemaufruf wird dort eine eindeutige Nummer und eine Kernel interne Funktion zugeordnet die fur die eigentliche Erledigung der erforderlichen Aufgaben zustandig ist Um einen Systemcall durchzufuhren wird die Nummer des gewunschten Aufrufs in das EAX Register der CPU gespeichert und anschliessend der Softwareinterrupt 128 in hexadezimaler Schreibweise 0x80 ausgelost Argumente an den Systemaufruf werden gemass der FastCall Aufrufkonvention in den CPU Registern abgelegt Der Softwareinterrupt auch Exception genannt unterbricht die Programmausfuhrung im Benutzer Modus und erzwingt das Ausfuhren eines Exception Handlers im Kernel Modus Dadurch wird der Kontextwechsel von einem unprivilegierten Ring auf Ring 0 gewahrleistet Der aufgerufene Exception Handler ist eine Funktion im Kernel die das EAX Register ausliest und dann sofern sich darin eine gultige Systemaufruf Nummer befindet die entsprechende Kernel Funktion aus der System Call Table mit den in den weiteren Registern liegenden Argumenten aufruft Nach der Uberprufung der Argumente werden letztlich die aus dem Benutzer Modus angeforderten Aufgaben vom Kernel erledigt Kehrt diese Funktion zuruck wird auch der Exception Handler erfolgreich abgeschlossen und der normale Programmfluss im unprivilegierten Modus fortgesetzt AT amp T Syntax Instruktion Quelle Ziel mov 6 eax close ist Systemaufruf 6 mov 15 ebx Dateideskriptor als erstes Argument int 0x80 Softwareinterrupt auslosen Softwareinterrupts haben aber nur eine sehr geringe Ausfuhrungsgeschwindigkeit Deshalb haben sowohl Intel als auch AMD in ihren x86 Prozessoren Befehle implementiert sysenter sysexit bzw syscall sysret letztere beiden erst ab der 64 Bit Architektur AMD64 die die Aufrufe beschleunigt durchfuhren konnen Da jedoch nicht jeder x86 Prozessor einen kompatiblen Befehl unterstutzt wird bei aktuellen Linux Versionen die sogenannte vsyscall Page verwendet in der der fur die benutzte Architektur passende Code hinterlegt wird 5 6 Wenn ein Programm nun einen Systemcall ausfuhren will springt es zu dieser Speicherseite und fuhrt dort den Programmfluss fort Unix und Unix Varianten Bearbeiten Bei vielen Unix Varianten z B alteren Solaris Versionen wird eine sogenannte call gate verwendet Dabei verwendet die Anwendung im Ring 3 einen Sprungbefehl an eine spezielle Adresse die das Call Gate beschreibt Call Gates sind zwar schneller als Software Interrupts Cyrix 6x86 23 benotigen jedoch 7 anstatt 2 Bytes Code Neuere Solaris Versionen beherrschen alternativ Software Interrupts sowie Syscall und Sysenter Befehle Windows Bearbeiten Systemaufrufe in Microsoft Windows werden ahnlich wie in Linux gehandhabt Die im Programmcode aufgerufene Bibliotheksfunktion aus der Windows API wird zunachst intern in einen Aufruf der so genannten Native API umgewandelt Dort wird eine fur jeden Aufruf eindeutige Nummer in das EAX Register gelegt und ein Zeiger auf die Argumente fur die Funktion im EDX Register gespeichert Uber die Assembler Instruktion sysenter wird die Kontrolle aus dem Benutzer Modus an den privilegierten Kernel abgegeben der die Parameter uberpruft und anschliessend eine der im EAX Register liegenden Nummer zugeordnete Kernel Funktion ausfuhrt Intel Syntax Instruktion Ziel Quelle mov eax 0x2f NtClose tragt die Nummer 0x2f in Windows Vista push 15 15 auf den Stack legen mov edx esp Pointer auf 15 in EDX speichern sysenter Systemaufruf durchfuhren Commodore Bearbeiten Beispielhaft fur die Funktionsweise von Systemaufrufen in alteren Systemen sei hier die Methode der fruhen Commodore Rechner genannt Die dort verwendeten Prozessoren der MOS Technology 6502 Familie kannten noch keine Unterscheidung zwischen Benutzer Modus und Kernel Modus und so war es moglich die Kernel internen Systemcall Funktionen direkt aus dem normalen Programmfluss aufzurufen Der einzige Sinn von Systemaufrufen war zu dieser Zeit daher nicht das Durchfuhren von Tatigkeiten die bestimmte Privilegien verlangten sondern eine vom Kernel implementierte Menge an standardisierten Funktionen bereitzustellen die unabhangig von weiteren Bibliotheken sind und sich auch noch auf spateren Versionen des Systems benutzen lassen sollten siehe auch bei Sprungtabelle Der Programmierer konnte nachdem er die Argumente der Funktion in die entsprechenden CPU Register gelegt hatte einfach mittels des Assembler Befehls JSR Jump to SubRoutine gefolgt von einer Adresse oder einem symbolischen Funktionsnamen eine im Kernel Adressraum liegende Routine anspringen Zur Zeit von Commodore BASIC 4 0 gab es 28 Systemaufrufe 7 LDA 15 15 in das Register A legen JSR SYS4 Zur Kernel Routine SYS4 CLOSE springen IBM System 360 Bearbeiten Mit der Instruktion SVC Supervisor Call wird beim IBM System 360 ein Supervisor Call Interrupt ausgelost die Instruktion hat ein 1 Byte Feld mit dem der Supervisor Call ausgewahlt wird Die Parameter werden in Registern ubergeben 8 OPEN PRINTOUT OUTPUT Makro Open DCB PRINTOUT Parameter Register laden SVC 19 aufrufen PRINTOUT DCB DDNAME SYSPRINT DSORG PS MACRF PM LRECL 80 Makro Data Control Block Einzelnachweise Bearbeiten A Tanenbaum Moderne Betriebssysteme Pearson Studium 2009 ISBN 978 3 8273 7342 7 S 85 git kernel org 21 November 2016 Windows X86 System Call Table NT 2000 XP 2003 Vista 2008 7 8 abgerufen am 14 April 2015 A Tanenbaum Moderne Betriebssysteme Pearson Studium 2009 ISBN 978 3 8273 7342 7 S 97 linux magazin de manugarg googlepages com commodore ca Anhang H 21 Juni 2007 IBM System 360 Principles of Operation IBM abgerufen am 15 Marz 2022 englisch Abgerufen von https de wikipedia org w index php title Systemaufruf amp oldid 236603838