Stellen Sie sich vor, Sie befinden sich auf einem großen Konzert. Um vom allgemeinen Zuschauerbereich zur exklusiven Backstage zu gelangen, können Sie nicht einfach hineinspazieren. Sie benötigen einen speziellen Ausweis, der Ihnen den Zugang durch eine bestimmte, bewachte Tür gewährt. In der Welt der Computer sind Systemaufrufe (System Calls) diese speziellen Ausweise.
Was sind Systemaufrufe?
Systemaufrufe, oft als Syscalls abgekürzt, bieten Benutzerprozessen eine Möglichkeit, Dienste direkt vom Kernel anzufordern. Der Kernel stellt eine Reihe von Diensten über die Systemaufruf-API bereit. Diese Dienste sind wesentlich für Operationen wie das Lesen oder Schreiben in eine Datei, die Speicherverwaltung oder die Handhabung von Netzwerkverbindungen. Die Anzahl der verfügbaren Systemaufrufe ist festgelegt; Sie können nicht willkürlich neue hinzufügen. Ihr System führt eine Syscall-Tabelle (syscall table), in der jeder Systemaufruf mit einer eindeutigen ID registriert ist.
Der Systemaufruf-Mechanismus unter Linux
Wenn Sie ein Programm wie ls ausführen, führt der darin enthaltene Code den Befehl Systemaufruf Linux nicht direkt aus. Stattdessen verwendet er eine Bibliotheksfunktion, die als Wrapper fungiert. Diese Wrapper-Funktion richtet die notwendigen Parameter ein und löst dann eine Software-Unterbrechung oder eine „Trap“ aus.
Diese Trap signalisiert dem Prozessor, vom nicht-privilegierten Benutzermodus in den privilegierten Kernelmodus zu wechseln. Im Kernelmodus übernimmt ein Systemaufruf-Handler die Steuerung. Er verwendet die eindeutige ID, um die angeforderte Funktion in der Syscall-Tabelle nachzuschlagen und führt sie dann aus. Beispielsweise wird der Systemaufruf stat(), der zur Abfrage des Status einer Datei verwendet wird, auf diese Weise gefunden und ausgeführt. Nachdem der Kernel die Aufgabe abgeschlossen hat, schaltet er den Kontext zurück in den Benutzermodus und gibt einen Statuscode an Ihren Prozess zurück, der Erfolg oder einen Fehler anzeigt.
Systemaufrufe mit strace anzeigen
Sie können die Systemaufrufe, die ein Prozess tätigt, in Echtzeit mit dem Befehl strace beobachten. Dieses Tool ist unglaublich nützlich für das Debugging und das Verständnis, wie ein Programm mit dem Kernel interagiert.
Um die Systemaufrufe des ls-Befehls anzuzeigen, würden Sie Folgendes ausführen:
strace ls
Dies gibt eine detaillierte Liste jedes Systemaufrufs aus, den ls während seiner Ausführung durchführt.