Heim > Artikel > Betrieb und Instandhaltung > Was ist ein Systemaufruf unter Linux?
In Linux bezieht sich der Systemaufruf auf eine Reihe spezieller Schnittstellen, die vom Betriebssystem zum Aufrufen bereitgestellt werden. Benutzerprogramme können Dienste vom Betriebssystemkernel entsprechend dieser Reihe von Schnittstellen abrufen Der Benutzerprozess fällt in den Kernel, oder Es wird gesagt, dass der Pfad für den Benutzerzugriff auf den Kernel geplant ist und der Kernel nur von einem festen Ort aus betreten werden kann.
Die Betriebsumgebung dieses Tutorials: Linux7.3-System, Dell G3-Computer.
2. Linux-Systemaufrufe
Für moderne Betriebssysteme sind Systemaufrufe ein gängiges Kommunikationsmittel zwischen Userspace und Kernel, und Linux bildet da keine Ausnahme. Nach Funktionsbereichen werden Linux-Systemaufrufe grob in Prozesssteuerung, Dateizugriff, Systemsteuerung, Speicherverwaltung, Netzwerkverwaltung, Prozesskommunikation usw. unterteilt. Eine detaillierte Beschreibung finden Sie in der Manpage-Beschreibung über den Befehl man 2 syscalls.
Der Systemaufruf sendet nur über den Soft-Interrupt-Mechanismus eine Anfrage an den Kernel und gibt den entsprechenden Dienst des Systemaufrufs ein. Die von Linux bereitgestellte Benutzerprogrammierschnittstelle folgt dem POSIX-Standard. Zusätzlich zur Definition einiger Standard-C-Funktionen bietet dieser Satz von Standards auch eine Reihe von Kapselungsroutinen zum Kapseln von Systemaufrufen für die Benutzerprogrammierung. Wenn Sie jedoch bereit sind, direkt aufzurufen, stellt der Linux-Kernel auch eine syscall()-Funktion zur Verfügung, um den Aufruf zu implementieren. Lernen Sie anhand des folgenden Beispiels den Unterschied zwischen C-Bibliotheksaufrufen und Direktaufrufen kennen. /*
** file: demo.c
** author: eric.xu
** date: 2016-02-25
*/
#include <syscall.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
int main(void)
{
long id1, id2;
/* system call no 20, __NR_getpid equal to SYS_getpid */
id1 = syscall(__NR_getpid);
printf("sys_call getpid %ldn", id1);
/* libc getpid */
id2 = getpid();
printf("libc getpid %ldn", id2);
return 0;
}
Kompilieren und ausführen, Sie können sehen, dass die Ergebnisse konsistent sind.
sys_call getpid 2899 libc getpid 28993. Linux-Systemaufrufimplementierung
Wenn ein Benutzermodusprozess einen Systemaufruf aufruft, wechselt die CPU in den Kernelmodus und beginnt mit der Ausführung von Kernelfunktionen. Da jeder Systemaufruf im Kernel eine eindeutige Bezeichnung hat, müssen Benutzermodusaufrufe einen Systemaufrufnummernparameter übergeben, um die spezifische Systemaufruffunktion zu bestimmen. Alle Systemaufruffunktionen sind Ganzzahlen. Im Kernel zeigen Ganzzahlen und 0 an, dass der Systemaufruf erfolgreich beendet wurde, und negative Zahlen weisen auf Fehlerbedingungen hin. Dieser Fehlerwert wird in der Variablen errno gespeichert und als Fehlercode an die Anwendung zurückgegeben.
Linux-Systemaufrufe werden mithilfe von Soft-Interrupts implementiert. In der x86-Architektur wird die Assembler-Anweisung int $0x80 aufgerufen. Diese Anweisung generiert eine Ausnahme mit einem Vektor von 128. In der Arm-Architektur wird der SWI-Befehl verwendet, um in den Kernelraum zu gelangen. Schauen wir uns das Format dieses Befehls an: SWI {cond} immed24;其中immed24表示24位立即数
Der SWI-Ausnahme-Interrupt-Handler muss die 24-Bit-Sofortnummer erhalten, indem er den SWI-Befehl liest, der das verursacht hat Software-Interrupt. Die grundlegenden Schritte bestehen darin, auf das SPSR-Register zuzugreifen, um zu bestimmen, ob es sich bei der Anweisung um eine ARM-Anweisung oder eine Thumb-Anweisung handelt, nachdem die SWI-Ausnahme generiert wurde, und dann die gesamte Befehlsadresse durch Zugriff auf das LR-Register abzurufen, dann die Anweisung abzurufen und die zu erhalten niedrigste 24-Bit-Direktdaten.
Verwandte Empfehlungen: „
Linux-Video-Tutorial“
Das obige ist der detaillierte Inhalt vonWas ist ein Systemaufruf unter Linux?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!