| Zeile 1: | Zeile 1: | ||
| − | Syscalls werden verwendet um Programmen Zugriff auf Funktionen im [[Kernel]] zu | + | '''Syscalls''' werden verwendet um Programmen Zugriff auf Funktionen im [[Kernel]] zu gewä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 übergeben. | ||
| − | Im Kernel wird dann ein Syscallhandler verwendet um die Funktion aufzulösen und die Parameter zu ü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. Im Unterschied dazu unterstützen neuere Intel Prozessoren die ''sysenter'' Instruktion. | ||
| + | |||
| + | Anschließend befindet sich der Prozessor im Kernelmodus (d.h. auf x86 Ring 0) und der Kernel übernimmt [[Syscall#Behandlung des Syscalls | die Behandlung des Syscalls]]. | ||
| + | |||
| + | == Behandlung des Syscalls == | ||
| + | Im Kernel wird dann ein Syscallhandler verwendet um die Funktion aufzulösen und die Parameter zu übergeben. Diese Funktion führt dann 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 dazu 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. | ||