Syscall

Aus Lowlevel
Wechseln zu:Navigation, Suche

Ein Syscall wird verwendet, um Programmen Zugriff auf Funktionen im Kernel zu gewähren. Da Programme in separaten Adressräumen untergebracht sind und nicht im Kernelmodus (d.h. im Ring 0 im Protected/Long-Mode) ausgeführt werden, ist es für das Programm unmöglich, bestimmte Aktionen wie zum Beispiel Interprozesskommunikation selbstständig auszuführen.

Parameterübergabe

Der aufrufende Prozess füllt entweder die Syscall-Parameter in Prozessorregister oder legt sie auf den Stack. Meistens wird der Syscall, den der Prozess aufrufen will, über eine Nummer als Parameter, z.B. über das Register eax, übergeben.

Anschließend löst der Prozess einen Syscall aus.

Auslösen des Syscalls

Meistens werden Syscalls mithilfe eines Software-Interrupts realisiert. Der auszulösende Softwareinterrupt hat normalerweise eine fest kodierte Nummer. Linux verwendet beispielsweise den Interrupt 0x80. In manchen Prozessoren sind spezielle Instruktionen für ein performanteres Auslösen von Syscalls vorgesehen. Beispielsweise unterstützen neuere AMD-Prozessoren die syscall-Instruktion und neuere Intel-Prozessoren die sysenter-Instruktion. ARM-CPUs haben dafür die svc-Instruktion.

Anschließend befindet sich der Prozessor im Kernelmodus, und der Kernel übernimmt.

Behandlung des Syscalls

Im Kernel wird dann ein Syscallhandler verwendet, um mit Hilfe der übergebenen Nummer die Funktion aufzurufen und die Parameter zu übergeben. Die von diesem Handler selektierte Funktion führt die vom Programm gewünschte Aktion aus, falls das Programm die benötigten Rechte dazu hat. Anschließend kehrt die Funktion zurück zu dem Programm und gibt möglicherweise einen oder mehrere Rückgabewerte über Prozessorregister oder Stack zurück. Alternativ kann das Programm auch geblockt werden, falls beispielsweise die Anfrage nach Daten von der Festplatte nicht sofort (über Caches) beantwortet werden kann, oder das Programm wird terminiert.

siehe auch