<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Systemaufruf</id>
	<title>Systemaufruf - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Systemaufruf"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Systemaufruf&amp;action=history"/>
	<updated>2026-05-22T01:12:25Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Systemaufruf&amp;diff=251121&amp;oldid=prev</id>
		<title>~2025-35431-19: /* Commodore */ genaue Seite verlinkt</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Systemaufruf&amp;diff=251121&amp;oldid=prev"/>
		<updated>2025-11-21T20:26:33Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Commodore: &lt;/span&gt; genaue Seite verlinkt&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Ein &amp;#039;&amp;#039;&amp;#039;Systemaufruf&amp;#039;&amp;#039;&amp;#039;, auch &amp;#039;&amp;#039;&amp;#039;Systemcall&amp;#039;&amp;#039;&amp;#039; (von {{enS|&amp;#039;&amp;#039;system call&amp;#039;&amp;#039;}}) oder kurz &amp;#039;&amp;#039;&amp;#039;Syscall&amp;#039;&amp;#039;&amp;#039;, ist in der [[Rechnertechnik|Computertechnik]] eine von [[Anwendungsprogramm]]en benutzte Methode, um vom [[Betriebssystem]] bereitgestellte Funktionalitäten auszuführen, wie etwa das Lesen einer Datei. Dabei wird die Kontrolle vom Programm an den [[Kernel (Betriebssystem)|Kernel]] übergeben.&amp;lt;ref&amp;gt;[[Andrew S. Tanenbaum|A. Tanenbaum]]: &amp;#039;&amp;#039;Moderne Betriebssysteme.&amp;#039;&amp;#039; Pearson Studium, 2009, ISBN 978-3-8273-7342-7, S. 85.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
In modernen Computersystemen (z.&amp;amp;nbsp;B. der [[IA-32]]-Architektur von [[Intel]]) läuft der [[Kernel (Betriebssystem)|Kernel]], also der Betriebssystemkern, in einem privilegierten Kernel-Modus (z.&amp;amp;nbsp;B. Ring 0 auf [[X86-Architektur|x86]], EL1 auf [[Arm-Architektur|ARM]], S-Mode auf [[RISC-V]]; siehe [[Privilegienstufe]]) und hat damit meist Zugriff auf den kompletten [[Befehlssatz]] der [[Hauptprozessor|CPU]] und den gesamten Speicherbereich. Aus Sicherheitsgründen laufen normale Benutzerprozesse dagegen im unprivilegierten Benutzer-Modus (z.&amp;amp;nbsp;B. Ringe 1–3 auf x86, EL0 auf ARM, U-Mode auf RISC-V), in denen ihnen weniger Befehle zur Verfügung stehen und sie daher gewisse Aufgaben nicht direkt erledigen können. Muss ein im Benutzer-Modus laufender [[Prozess (Informatik)|Prozess]] eine Aufgabe erfüllen, die nur in einem höher privilegierten Modus möglich ist, wie z.&amp;amp;nbsp;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 über die CPU an den Kernel ab und wird so lange [[Interrupt|unterbrochen]], bis die Anfrage komplett bearbeitet ist. Nach dem Systemaufruf gibt der Kernel die CPU wieder an den Prozess im Benutzer-Modus ab und führt den Programmcode an der Stelle fort, an der der Kontextwechsel zuvor gefordert wurde. Zu keiner Zeit verlässt der Prozess seinen unprivilegierten Modus und kann so auch nicht Gefahr laufen, andere Prozesse oder gar die Stabilität des Systemkernels selbst zu gefährden, da nur vertrauenswürdiger Code aus dem Kernel im privilegierten Modus ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
Ein Systemaufruf kann sowohl dafür zuständig sein, Informationen an die Hardware, den Kernel selbst oder andere Prozesse zu schicken, als auch solche zu lesen. Dafür 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 überhaupt etwas anfangen kann. Auch dies ist eine Folge der strikten Trennung zwischen Kernel-Modus und Benutzer-Modus.&lt;br /&gt;
&lt;br /&gt;
Die Systemaufruf-Schnittstellen, d.&amp;amp;nbsp;h. die [[Application Binary Interface|ABI]]s der meisten modernen Betriebssysteme sind nicht standardisiert und können sich zwischen Versionen drastisch ändern. Eine prominente Ausnahme zu dieser Regel ist der [[Linux (Kernel)|Linux-Kernel]], welcher eine stabile Systemaufruf-Schnittstelle garantiert.&amp;lt;ref&amp;gt;{{Internetquelle |url=https://www.kernel.org/doc/html/v4.14/process/adding-syscalls.html |titel=Adding a New System Call — The Linux Kernel documentation |sprache=en |abruf=2023-12-25 |zitat=A new system call forms part of the API of the kernel, and has to be supported indefinitely.}}&amp;lt;/ref&amp;gt; Im Linux-Kernel 4.4 ([[Support (Dienstleistung)#Long Term Support|LTS]]) für die [[X86-Prozessor|x86-Architektur]] sind momentan 376 Aufrufe definiert.&amp;lt;ref&amp;gt;[https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/arch/x86/entry/syscalls/syscall_32.tbl?id=refs/tags/v4.4.34 git.kernel.org] (21.&amp;amp;nbsp;November 2016)&amp;lt;/ref&amp;gt; Die Anzahl der Systemaufrufe in [[Microsoft Windows Vista]] beträgt laut inoffiziellen Quellen 360.&amp;lt;ref&amp;gt;[http://j00ru.vexillium.org/ntapi/ Windows X86 System Call Table (NT/2000/XP/2003/Vista/2008/7/8)], abgerufen am 14. April 2015&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bibliotheksfunktionen ==&lt;br /&gt;
Die meisten Systeme stellen eine [[Programmierschnittstelle]] (API) für Systemaufrufe in Form von [[Programmbibliothek|Bibliotheksfunktionen]] zur Verfügung, die es einem Programmierer erleichtern, Arbeiten zu erledigen, die einen erweiterten Zugriff auf den Befehlssatz der CPU erfordern.&lt;br /&gt;
&lt;br /&gt;
Häufig verwendete Bibliotheksfunktionen (beispielsweise unter [[POSIX]]), die auf Systemaufrufen basieren, sind unter anderem die Dateiverarbeitungsfunktionen &amp;#039;&amp;#039;open&amp;#039;&amp;#039;, &amp;#039;&amp;#039;close&amp;#039;&amp;#039;, &amp;#039;&amp;#039;read&amp;#039;&amp;#039; und &amp;#039;&amp;#039;write&amp;#039;&amp;#039;, sowie &amp;#039;&amp;#039;exec&amp;#039;&amp;#039;, &amp;#039;&amp;#039;fork&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;exit&amp;#039;&amp;#039;. Diese können vom Programmierer wie normale Benutzer-Modus-Funktionen genutzt werden, führen aber unbemerkt im Hintergrund einen Kontextwechsel durch. Die Abkapselung der Systemaufrufe über eine API befreit den Programmierer vollständig von Überlegungen über die interne Funktionsweise des Betriebssystems oder der Hardware und erlaubt eine abstraktere Softwareentwicklung. So ist es möglich, je nach Betriebssystem eine Funktion komplett ohne Systemaufruf bzw. durch eine Kombination mehrerer Systemaufrufe zu implementieren.&lt;br /&gt;
&lt;br /&gt;
Die meisten dieser POSIX-Funktionen haben äquivalente Entsprechungen unter [[Win32]]. &amp;#039;&amp;#039;time&amp;#039;&amp;#039; unter POSIX entspricht beispielsweise &amp;#039;&amp;#039;GetLocalTime&amp;#039;&amp;#039; unter Win32.&amp;lt;ref&amp;gt;[[Andrew S. Tanenbaum|A. Tanenbaum]]: &amp;#039;&amp;#039;Moderne Betriebssysteme.&amp;#039;&amp;#039; Pearson Studium, 2009, ISBN 978-3-8273-7342-7, S. 97.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Implementierung ==&lt;br /&gt;
Die [[Implementierung]] von Systemaufrufen hängt stark von der verwendeten Hardware, der Architektur und letztlich auch dem benutzten Betriebssystem ab. In der Regel wird heute ein Systemaufruf mit [[Softwareinterrupt]]s oder anderen Spezialinstruktionen der CPU realisiert. Bei älteren Systemen findet meist einfach nur ein Sprung an eine fest definierte Adresse statt, an der der Systemaufruf oder ein Sprungbefehl zu diesem implementiert ist. Für einen Programmierer, der die zur Verfügung gestellte Programmierschnittstelle des Betriebssystems nutzt, ist die Implementation von Systemcalls irrelevant.&lt;br /&gt;
&lt;br /&gt;
In den Beispielen wird eine geöffnete Datei mit dem [[Datei-Handle|Dateideskriptor/Handle]] 15 geschlossen.&lt;br /&gt;
&lt;br /&gt;
=== Linux (x86) ===&lt;br /&gt;
{{Hauptartikel|Liste der Linux-Systemaufrufe}}&lt;br /&gt;
&lt;br /&gt;
Der Linux-Kernel beherbergt eine Liste aller ihm bekannten Systemaufrufe, die so genannte &amp;#039;&amp;#039;System Call Table&amp;#039;&amp;#039;. Jedem Systemaufruf wird dort eine eindeutige Nummer und eine Kernel-interne Funktion zugeordnet, die für die eigentliche Erledigung der erforderlichen Aufgaben zuständig ist. Um einen Systemcall durchzuführen, wird die Nummer des gewünschten Aufrufs in das [[Register (Computer)|EAX-Register]] der CPU gespeichert und anschließend der Softwareinterrupt 128 (in hexadezimaler Schreibweise 0x80) ausgelöst. Argumente an den Systemaufruf werden gemäß der FastCall-[[Aufrufkonvention]] in den CPU-Registern abgelegt.&lt;br /&gt;
&lt;br /&gt;
Der [[Software-Interrupt|Softwareinterrupt]] (auch &amp;#039;&amp;#039;Exception&amp;#039;&amp;#039; genannt) unterbricht die Programmausführung im Benutzer-Modus und erzwingt das Ausführen eines Exception-Handlers im Kernel-Modus. Dadurch wird der Kontextwechsel von einem unprivilegierten Ring auf Ring 0 gewährleistet. Der aufgerufene Exception-Handler ist eine Funktion im Kernel, die das EAX-Register ausliest und dann, sofern sich darin eine gültige Systemaufruf-Nummer befindet, die entsprechende Kernel-Funktion aus der &amp;#039;&amp;#039;System Call Table&amp;#039;&amp;#039; mit den in den weiteren Registern liegenden Argumenten aufruft. Nach der Überprüfung der Argumente werden letztlich die aus dem Benutzer-Modus angeforderten Aufgaben vom Kernel erledigt. Kehrt diese Funktion zurück, wird auch der Exception-Handler erfolgreich abgeschlossen und der normale Programmfluss im unprivilegierten Modus fortgesetzt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
; AT&amp;amp;T Syntax: Instruktion Quelle Ziel&lt;br /&gt;
mov $6,  %eax    ; close() ist Systemaufruf 6&lt;br /&gt;
mov $15, %ebx    ; Dateideskriptor als erstes Argument&lt;br /&gt;
int $0x80        ; Softwareinterrupt auslösen&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Softwareinterrupts haben aber nur eine sehr geringe Ausführungsgeschwindigkeit. Deshalb haben sowohl Intel als auch [[Advanced Micro Devices|AMD]] in ihren x86-Prozessoren Befehle implementiert (&amp;#039;&amp;#039;sysenter&amp;#039;&amp;#039;/&amp;#039;&amp;#039;sysexit&amp;#039;&amp;#039;, bzw. &amp;#039;&amp;#039;syscall&amp;#039;&amp;#039;/&amp;#039;&amp;#039;sysret&amp;#039;&amp;#039;, letztere beiden erst ab der 64-Bit-Architektur [[AMD64]]), die die Aufrufe beschleunigt durchführen können. Da jedoch nicht jeder x86-Prozessor einen kompatiblen Befehl unterstützt, wird bei aktuellen Linux-Versionen die sogenannte &amp;#039;&amp;#039;vsyscall-Page&amp;#039;&amp;#039; verwendet, in der der für die benutzte Architektur passende Code hinterlegt wird.&amp;lt;ref&amp;gt;[http://www.linux-magazin.de/heft_abo/ausgaben/2004/08/kern_technik linux-magazin.de]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://manugarg.googlepages.com/systemcallinlinux2_6.html manugarg.googlepages.com]&amp;lt;/ref&amp;gt; Wenn ein Programm nun einen Systemcall ausführen will, springt es zu dieser [[Speicherseite]] und führt dort den Programmfluss fort.&lt;br /&gt;
&lt;br /&gt;
=== Unix und Unix-Varianten ===&lt;br /&gt;
Bei vielen [[Unix]]-Varianten (z.&amp;amp;nbsp;B. älteren Solaris-Versionen) wird eine sogenannte „{{lang|en|call gate}}“ verwendet. Dabei verwendet die Anwendung (im Ring 3) einen Sprungbefehl an eine spezielle Adresse, die das Call-Gate beschreibt.&lt;br /&gt;
&lt;br /&gt;
Call Gates sind zwar schneller als Software-Interrupts (Cyrix 6x86: 23 %), benötigen jedoch 7 anstatt 2 Bytes Code.&lt;br /&gt;
&lt;br /&gt;
Neuere Solaris-Versionen beherrschen alternativ Software-Interrupts sowie Syscall und Sysenter-Befehle.&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
Systemaufrufe in [[Microsoft Windows]] werden ähnlich wie in Linux gehandhabt. Die im Programmcode aufgerufene Bibliotheksfunktion aus der [[Windows Application Programming Interface|Windows API]] wird zunächst intern in einen Aufruf der so genannten [[Native API|{{lang|en|Native API}}]] umgewandelt. Dort wird eine für jeden Aufruf eindeutige Nummer in das EAX-Register gelegt und ein Zeiger auf die Argumente für die Funktion im EDX-Register gespeichert. Über die [[Assemblersprache|Assembler]]-Instruktion &amp;#039;&amp;#039;sysenter&amp;#039;&amp;#039; wird die Kontrolle aus dem Benutzer-Modus an den privilegierten Kernel abgegeben, der die Parameter überprüft und anschließend eine der im EAX-Register liegenden Nummer zugeordnete Kernel-Funktion ausführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
; Intel-Syntax: Instruktion Ziel Quelle&lt;br /&gt;
 mov eax, 0x2f    ; NtClose() trägt die Nummer 0x2f in Windows Vista&lt;br /&gt;
 push 15          ; 15 auf den Stack legen&lt;br /&gt;
 mov edx, esp     ; Pointer auf 15 in EDX speichern&lt;br /&gt;
 sysenter         ; Systemaufruf durchführen&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Commodore ===&lt;br /&gt;
Beispielhaft für die Funktionsweise von Systemaufrufen in älteren Systemen sei hier die Methode der frühen [[Commodore International|Commodore]]-Rechner genannt. Die dort verwendeten Prozessoren der [[MOS Technology]] [[MOS Technology 6502|6502-Familie]] kannten noch keine Unterscheidung zwischen Benutzer-Modus und Kernel-Modus und so war es möglich, die Kernel-internen Systemcall-Funktionen direkt aus dem normalen Programmfluss aufzurufen. Der einzige Sinn von Systemaufrufen war zu dieser Zeit daher nicht das Durchführen von Tätigkeiten, die bestimmte Privilegien verlangten, sondern eine vom Kernel implementierte Menge an standardisierten Funktionen bereitzustellen, die unabhängig von weiteren Bibliotheken sind und sich auch noch auf späteren Versionen des Systems benutzen lassen sollten (siehe auch bei [[Sprungtabelle]]).&lt;br /&gt;
&lt;br /&gt;
Der Programmierer konnte, nachdem er die Argumente der Funktion in die entsprechenden CPU-Register gelegt hatte, einfach mittels des Assembler-Befehls &amp;#039;&amp;#039;JSR&amp;#039;&amp;#039; ({{lang|en|&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;J&amp;#039;&amp;#039;&amp;#039;ump to &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039;ub&amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039;outine&amp;#039;&amp;#039;}}), 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.&amp;lt;ref&amp;gt;[http://www.commodore.ca/manuals/pdfs/Commodore_Basic_4_Users_Reference%20Manual.pdf#page=126 User’s Reference Manual: Commodore BASIC Version 4.0, Anhang H: Assembly Language and System Calls] (21.&amp;amp;nbsp;Juni 2007)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 LDA #15         ; 15 in das Register A legen&lt;br /&gt;
 JSR SYS4        ; Zur Kernel-Routine SYS4 (CLOSE) springen&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== IBM System/360 ===&lt;br /&gt;
Mit der Instruktion &amp;#039;&amp;#039;&amp;#039;SVC&amp;#039;&amp;#039;&amp;#039; (Supervisor Call) wird beim [[System/360|IBM System/360]] ein &amp;#039;&amp;#039;Supervisor Call Interrup&amp;#039;&amp;#039;t ausgelöst, die Instruktion hat ein 1 Byte Feld, mit dem der Supervisor Call ausgewählt wird. Die Parameter werden in Registern übergeben.&amp;lt;ref&amp;gt;{{Internetquelle |url=https://dl.acm.org/doi/pdf/10.5555/1102026 |titel=IBM System/360 Principles of Operation |hrsg=IBM |sprache=en |abruf=2022-03-15}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
 OPEN (PRINTOUT,(OUTPUT)) Makro: Open DCB PRINTOUT, Parameter Register laden, SVC 19 aufrufen&lt;br /&gt;
 PRINTOUT DCB DDNAME=SYSPRINT,DSORG=PS,MACRF=(PM),LRECL=80 Makro: Data Control Block *&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Betriebssystemkomponente]]&lt;/div&gt;</summary>
		<author><name>~2025-35431-19</name></author>
	</entry>
</feed>