Systemanruf

Im Computer, a Systemanruf (üblicherweise abgekürzt zu symall) ist die programmatische Art und Weise, in der a Computer Programm fordert einen Dienst von der an Kernel des Betriebssystem auf die es ausgeführt wird. Dies kann Hardware-bezogene Dienste umfassen (z. B. Zugriff auf a Festplatte oder Zugriff auf die Kamera des Geräts), Erstellung und Ausführung neuer Prozesseund Kommunikation mit integraler Bedeutung Kerneldienste wie zum Beispiel Prozessplanung. Systemaufrufe bieten eine wesentliche Schnittstelle zwischen einem Prozess und dem Betriebssystem.
In den meisten Systemen können Systemanrufe nur aus getätigt werden UserSpace Prozesse, während in einigen Systemen, OS/360 und Nachfolger Zum Beispiel gibt der privilegierte Systemcode auch Systemaufrufe aus.[1]
Privilegien
Das die Architektur Von den meisten modernen Prozessoren beinhaltet mit Ausnahme einiger eingebetteter Systeme a Sicherheitsmodell. Zum Beispiel die Ringe Das Modell gibt mehrere Privilegien an, unter denen Software ausgeführt werden kann: Ein Programm ist normalerweise auf sich beschränkt Adressraum Damit es nicht auf andere laufende Programme oder das Betriebssystem selbst zugreifen oder ändern kann und normalerweise daran gehindert wird, Hardware -Geräte direkt zu manipulieren (z. B. die Bildspeicher, Framebuffer oder Netzwerk Geräte).
Viele Anwendungen erfordern jedoch Zugriff auf diese Komponenten. Daher werden Systemaufrufe vom Betriebssystem zur Verfügung gestellt, um gut definierte, sichere Implementierungen für solche Vorgänge bereitzustellen. Das Betriebssystem wird auf höchstem Niveau der Berechtigung ausgeführt und ermöglicht es Anwendungen, Dienste über Systemaufrufe anzufordern Interrupts. Ein Interrupt steckt die CPU automatisch in eine erhöhte Privilegienniveau und übergibt dann die Kontrolle an den Kernel, was feststellt, ob dem aufgerufenen Programm den angeforderten Dienst gewährt werden soll. Wenn der Dienst gewährt wird, führt der Kernel eine bestimmte Reihe von Anweisungen aus, über die das aufrufende Programm keine direkte Kontrolle hat, die Berechtigungsstufe an das des aufrufenden Programms zurückgibt und dann die Kontrolle über das Anrufprogramm zurückgibt.
Die Bibliothek als Vermittler
Im Allgemeinen bieten Systeme a Bibliothek oder API Das liegt zwischen normalen Programmen und dem Betriebssystem. An Unix-artig Systeme, diese API ist normalerweise Teil einer Implementierung der C Bibliothek (libc), wie z. Glibcdas liefert Wrapper -Funktionen Für die Systemaufrufe, die häufig mit den aufgerufenen Systemaufrufen genannt werden. An Windows NT, diese API ist Teil der Einheimische API, in dem ntdll.dll Bibliothek; Dies ist eine undokumentierte API, die durch Implementierungen des regulären verwendet wird Windows -API und direkt von einigen Systemprogrammen unter Windows verwendet. Die Wrapper -Funktionen der Bibliothek enthüllen eine gewöhnliche Funktion Konvention anrufen (a Subroutine Rufen Sie die an Montage Level) für die Verwendung des Systemaufrufs sowie für den Aufruf des Systems mehr modular. Hier besteht die Hauptfunktion des Wrappers darin, alle Argumente zu platzieren, die an den Systemaufruf übergeben werden sollen Prozessorregister (und vielleicht auf der Rufen Sie Stack an auch) und auch eine eindeutige Systemanrufnummer für den Kernel einstellen. Auf diese Weise nimmt die Bibliothek zu, die zwischen dem Betriebssystem und der Anwendung besteht Portabilität.
Der Anruf in die Bibliotheksfunktion selbst führt nicht zu einem Wechsel auf Kernelmodus und ist normalerweise normal Unterroutine -Anruf (Verwenden Sie beispielsweise eine "Anruf" -Anbaugruppe in einigen Anweisungsset Architekturen (Ist als)). Der tatsächliche Systemaufruf überträgt die Steuerung in den Kernel (und ist mehr implementierungsabhängiger und plattformabhängiger als der Bibliotheksaufruf, der es abstrahiert). Zum Beispiel in Unix-artig Systeme, Gabel
und ausführen
sind C -Bibliotheksfunktionen, die wiederum Anweisungen ausführen, die die aufrufen Gabel
und Geschäftsführer
Systemaufrufe. Das System direkt in der Anwendungscode ist komplizierter und benötigt möglicherweise ein eingebetteter Montagescode (in C und C ++) und erfordert Kenntnisse über die Binärgrenzfläche mit niedriger Ebene für den Systemaufrufbetrieb, der sich im Laufe der Zeit ändern kann und daher nicht Teil des Anwendung Binärschnittstelle; Die Bibliotheksfunktionen sollen dies abstrahieren.
An Exokernel Basierte Systeme, die Bibliothek ist als Vermittler besonders wichtig. Auf Exokernel schützen Bibliotheken Benutzeranwendungen aus dem Kernel mit sehr niedrigem Niveau API, und sorgen Abstraktionen und Ressource Management.
IBM OS/360 und DOS/360 Implementieren Sie die meisten Systemanrufe über eine Bibliothek mit Montagesprachen Makros,[a] Obwohl es einige Dienste mit einer Anrufverbindung gibt. Dies spiegelt ihren Ursprung in einer Zeit wider, als die Programmierung in der Montagesprache häufiger war als hochrangige Sprache Verwendungszweck. IBM-Systemaufrufe wurden daher nicht direkt von Sprachprogrammen auf hoher Ebene ausführbar, sondern eine Subroutine für die Sprachverpackung von Callable Assembler erforderlich. Seitdem hat IBM viele Dienste hinzugefügt, die aus hochstufigen Sprachen in z. Z/OS und Z/VSE.
Beispiele und Werkzeuge
An Unix, Unix-artig und andere Posix-Compliant -Betriebssysteme, beliebte Systemaufrufe sind offen
, lesen
, schreiben
, nah dran
, Warten
, Geschäftsführer
, Gabel
, Ausfahrt
, und töten
. Viele moderne Betriebssysteme haben Hunderte von Systemanrufen. Zum Beispiel, Linux und OpenBSD Jeder hat über 300 verschiedene Anrufe,[2][3] Netbsd hat fast 500,[4] Freebsd hat über 500,[5] Windows hat fast 2000, geteilt zwischen Win32K (grafisch) und NTDLL (CORE) -Systemaufrufen[6] während Plan 9 hat 51.[7]
Werkzeuge wie Strace, ftrace und Binder Erlauben Sie einem Prozess, von Start auszuführen und alle Systemaufrufe des Prozesses zu melden, oder kann an einen bereits laufenden Prozess anhängen und einen vom genannten Prozess getätigten Systemaufruf abfangen, wenn der Vorgang nicht gegen die Berechtigungen des Benutzers verstößt. Diese besondere Fähigkeit des Programms wird normalerweise auch mit Systemaufrufen wie wie z. B. implementiert Ptrace oder Systemaufrufe in Dateien in Procfs.
Typische Implementierungen
Das Implementieren von Systemaufrufen erfordert eine Steuerung von Benutzerraum zum Kernelraum, der eine Art architekturspezifischer Funktion umfasst. Eine typische Möglichkeit, dies zu implementieren, besteht darin, a zu verwenden Software Interrupt oder fangen. Unterbricht die Übertragungsregelung in das Betriebssystem KernelDie Software muss also lediglich ein Register mit der benötigten Systemaufrufnummer einrichten und die Software -Interrupt ausführen.
Dies ist die einzige Technik für viele RISC Prozessoren, aber CISC Architekturen wie x86 Unterstützen Sie zusätzliche Techniken. Zum Beispiel der x86 Befehlssatz Enthält die Anweisungen Symall
/Syset
und SYSENTER
/Sysexit
(Diese beiden Mechanismen wurden unabhängig voneinander geschaffen von AMD und IntelAber im Wesentlichen tun sie das Gleiche). Dies sind "schnelle" Steuertransferanweisungen, die so konzipiert sind, dass sie die Steuerung schnell in den Kernel für einen Systemanruf übertragen, ohne den Overhead eines Interrupts.[8] Linux 2.5 begann das auf der x86, wo gibt es das; Früher benutzte es das Int
Anweisung, wo die Systemanrufnummer in die platziert wurde Eax
registrieren Vor unterbrechen 0x80 wurde ausgeführt.[9][10]
Ein älterer Mechanismus ist der Rufen Sie Tor an; ursprünglich verwendet in Mehrheit und später zum Beispiel siehe Rufen Sie Tor an auf dem Intel x86. Es ermöglicht ein Programm, eine Kernelfunktion mit einem sicheren Steuertransfermechanismus direkt aufzurufen, den das Betriebssystem im Voraus festlegt. Dieser Ansatz war auf X86 unpopulär, vermutlich aufgrund der Anforderung eines FAR -Aufrufs (ein Aufruf eines Verfahrens in einem anderen Segment als das aktuelle Codesegment[11]) was verwendet X86 Speichersegmentierung und der daraus resultierende Mangel an Portabilität Es verursacht und die Existenz der oben genannten schnelleren Anweisungen.
Zum IA-64 die Architektur, EPC
(Geben Sie den berechtigten Code ein) Anweisungen werden verwendet. Die ersten acht Systemanrufargumente werden in Registern verabschiedet, und der Rest wird am Stapel weitergegeben.
In dem IBM System/360 Mainframe -Familie und ihre Nachfolger, a Aufrufanweisung (SVC) implementiert mit der Zahl in der Anweisung und nicht in einem Register einen Systemaufruf für Legacy -Einrichtungen in den meisten Fällen[b] Die eigenen Betriebssysteme von IBM und für alle Systemaufrufe unter Linux. In späteren Versionen von MVS verwendet IBM die Anweisung für Programm Call (PC) für viele neuere Einrichtungen. Insbesondere wird der PC verwendet, wenn sich der Anrufer befindet Serviceanfrageblock (SRB) Modus.
Das PDP-11 Minicomputer benutzte die EMT und IoT Anweisungen, die, ähnlich wie das IBM -System/360 SVC und x86 IntStecken Sie den Code in die Anweisung; Sie generieren Interrupts für bestimmte Adressen und übertragen die Steuerung an das Betriebssystem. Das Vax 32-Bit-Nachfolger der PDP-11-Serie verwendete die CHMK, Chme, und CHMS Anweisungen, um Systemanrufe zum privilegierten Code auf verschiedenen Ebenen zu tätigen; Der Code ist ein Argument für die Anweisung.
Kategorien von Systemaufrufen
Systemaufrufe können ungefähr in sechs Hauptkategorien eingeteilt werden:[12]
- Prozesssteuerung
- Prozess erstellen (zum Beispiel,
Gabel
auf unix-ähnlichen Systemen oderNtCreateProcess
in dem Windows NT Einheimische API) - Prozess beenden
- Belastung, ausführen
- Prozessattribute erhalten/festlegen
- Warten Für die Zeit, Warteveranstaltung, Signal Veranstaltung
- zuweisen und frei Erinnerung
- Prozess erstellen (zum Beispiel,
- Dokumentenverwaltung
- Datei erstellen, Datei löschen
- öffnen schließen
- Lesen, schreiben, neu positionieren
- Dateiattribute erhalten/festlegen
- Geräteverwaltung
- Anforderungsgerät, Release -Gerät
- Lesen, schreiben, neu positionieren
- Geräteattribute erhalten/festlegen
- Geräte logisch anbringen oder abnehmen
- Informationswartung
- Total -Systeminformationen abrufen/festlegen (einschließlich Uhrzeit, Datum, Computername, Enterprise usw.)
- GET/SET -Prozess-, Datei- oder Gerätemetadaten (einschließlich Autor, Opener, Erstellungszeit und Datum usw.)
- Kommunikation
- Kommunikationsverbindung erstellen, löschen
- Nachrichten senden, empfangen
- Übertragungsstatusinformationen
- Remote -Geräte beibringen oder abnehmen
- Schutz
- Dateiberechtigungen erhalten/festlegen
Prozessormodus und Kontextwechsel
Systemaufrufe in den meisten Unix-artig Systeme werden in verarbeitet Kernelmodus, was erreicht wird, indem der Prozessorausführungsmodus in eine privilegiertere, aber nein geändert wird Prozess Kontextschalter ist notwendig - obwohl a Privileg Kontextschalter tritt auf. Die Hardware sieht die Welt im Hinblick auf den Ausführungsmodus gemäß dem Prozessor Statusregisterund Prozesse sind eine Abstraktion, die vom Betriebssystem bereitgestellt wird. Ein Systemaufruf erfordert im Allgemeinen keinen Kontextschalter zu einem anderen Prozess. Stattdessen wird es im Kontext dessen, welcher Prozess aufgerufen wurde, verarbeitet.[13][14]
In einem Multithread Prozess, Systemanrufe können aus mehreren getätigt werden Themen. Der Umgang mit solchen Aufrufen hängt von der Gestaltung des spezifischen Betriebssystemkernels und der Anwendungs -Laufzeitumgebung ab. Die folgende Liste zeigt typische Modelle, gefolgt von Betriebssystemen:[15][16]
- Viele zu eins Modell: Alle Systemaufrufe von jedem Benutzer-Thread in einem Prozess werden von einem einzelnen Thread auf Kernelebene behandelt. Dieses Modell hat einen ernsthaften Nachteil - jeder Blockierungssystemaufruf (wie das Warten auf Eingaben des Benutzer) kann alle anderen Threads einfrieren. Da nur ein Thread gleichzeitig auf den Kernel zugreifen kann, kann dieses Modell nicht mehrere Prozessorenkerne verwenden.
- Eins zu eins Modell: Jeder Benutzer-Thread wird während eines Systemaufrufs an einen bestimmten Thread auf Kernelebene angehängt. Dieses Modell löst das obige Problem der Blockierung von Systemaufrufen. Es ist in allen Major gefunden Linux -Verteilungen, Mac OS, iOS, jüngste Fenster und Solaris Versionen.
- Viel zu viel Modell: In diesem Modell wird ein Pool von Benutzer -Threads einem Pool von Kernel -Threads zugeordnet. Alle Systemaufrufe eines Benutzer -Thread -Pools werden von den Threads in ihrem entsprechenden Kernel behandelt Fadenpool.
- Hybrid Modell: Dieses Modell implementiert sowohl viele bis viele und eins eins Modelle, abhängig von der Auswahl des Kernels. Dies findet sich in alten Versionen von Irrix, HP-UX und Solaris.
Siehe auch
Anmerkungen
Verweise
- ^ IBM (März 1967). "SVC -Routinen schreiben". IBM System/360 Betriebssystem -Systemprogrammierhandbuch (PDF). Dritte Edition. S. 32–36. C28-6550-2.
- ^ "Systems (2) - Linux Manual Page".
- ^ OpenBSD (14. September 2013). "Systemaufrufnamen (Kern/syScalls.c)". BSD Cross Referenz.
- ^ NetBSD (17. Oktober 2013). "Systemaufrufnamen (Kern/syScalls.c)". BSD Cross Referenz.
- ^ "FreeBSD syscalls.c, die Liste der Systemnamen und IDs".
- ^ Autor: Mateusz "J00RU" Jurczyk (5. November 2017). "Windows Win32K.SYS -Systemanrufetabelle (NT/2000/XP/2003/Vista/2008/8/8/10)".
{{}}
:|author=
hat generischen Namen (Hilfe) - ^ "Plan 9 SYS.H, Die Liste der Syskallnamen und IDs".
- ^ "Sysenter (Osdev Wiki)".
- ^ Anonymous (19. Dezember 2002). "Linux 2.5 erhält vsyscalls, sysenter Unterstützung". Kerneltrap. Abgerufen 1. Januar 2008.
- ^ Manu Garg (2006). "Sysenter -basierter Systemaufrufmechanismus in Linux 2.6".
- ^ "Befreiung: x86 Anweisungssatzreferenz". Renejeschke.de. Abgerufen 4. Juli 2015.
- ^ Silberschatz, Abraham (2018). Betriebssystemkonzepte. Peter B Galvin; Greg Gagne (10. Aufl.). Hoboken, NJ: Wiley. p. 67. ISBN 9781119320913. OCLC 1004849022.
- ^ Bach, Maurice J. (1986), Das Design des UNIX -Betriebssystems, Prentice Hall, S. 15–16.
- ^ Elliot, John (2011). "Diskussion der Systemanruf -Implementierung bei Progclub einschließlich Zitat von Bach 1986".
- ^ "Threads".
- ^ "Threading -Modelle" (PDF).
Externe Links
- Linux 64-Bit-Systemanrufreferenz/-auflistung Bis zur Kernel Version 4.20
- Linux -Systemanrufreferenz Aktualisierte Systemanrufreferenz für Linux Kernel 2.6.35.4 enthält Register- und Datenstrukturreferenzen. Auch für Linux -Kernel 4.14 64 Bit und 32 Bit.
- Eine Liste moderner Unix-ähnlicher Systemanrufe
- Interaktive Linux -Kernelkarte mit Haupt -API -Funktionen und -strukturen, PDF Ausführung
- Linux -Systemaufrufe- Systemaufrufe für Linux Kernel 2.2, mit IA-32 Konventionen anrufen
- Wie Systemanrufe unter Linux/i86 funktionieren (1996, basierend auf dem Kern von 1993 0,99,2)
- Sysenter -basierter Systemaufrufmechanismus in Linux 2.6 (2006)
- Kernel -Befehl mit Linux -Systemaufrufen, IBM Developerworks
- Choudhary, Amit; Howto für die Implementierung eines Systemaufrufs unter Linux 2.6
- Jorrit N. Herder, Herbert Bos, Ben Gras, Philip Homburg und Andrew S. Tanenbaum. Modulare Systemprogrammierung auf Minix 3, ;Anmeldung: 31, nein. 2 (April 2006); 19–28, abgerufen am 5. März 2018
- Eine einfache offene Unix -Shell in C -Sprache- Beispiele zu Systemaufrufen unter UNIX
- In der einheimischen API- - Windows NT Einheimische API, einschließlich Systemaufrufe
- Gulbrandsen, John; Systemanrufoptimierung mit dem Sysenter -Befehl, Codeguru.com, 8. Oktober 2004