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 [[IPC | 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 [[Syscall#Auslösen des Syscalls | löst der Prozess einen Syscall aus]]. == Auslösen des Syscalls == Meistens werden Syscalls mithilfe eines Software-[[Interrupt]]s 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 x86 AMD Prozessoren die ''syscall'' Instruktion und neuere Intel Prozessoren die ''sysenter'' Instruktion. Anschließend befindet sich der Prozessor im Kernelmodus, und der Kernel übernimmt [[Syscall#Behandlung des Syscalls | die Behandlung des Syscalls]]. == 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 == * [[Interrupt]] [[Kategorie:Glossar]]