Heim > Artikel > System-Tutorial > Einführung in den Systemaufrufprozess unter Linux
Schauen wir uns zunächst ein Bild an, um ein grobes Verständnis zu bekommen.
Zunächst kann die Anwendung direkt die vom System bereitgestellte API aufrufen, was im Benutzermodus (Ring3) erfolgen kann.
Dann speichert die entsprechende API die entsprechende Systemaufrufnummer im EAX-Register (dieser Schritt wird durch Inline-Assembly implementiert) und löst dann mit int 0x80 den Interrupt aus (Inline-Assembly) und gibt die Interrupt-Verarbeitungsfunktion ein (diese Funktion ist vollständig). in Assembler-Code geschrieben), tritt dieses Mal in den Kernel-Status (Ring0) ein.
In der Interrupt-Verarbeitungsfunktion wird der Systemaufruf aufgerufen, der der Systemaufrufnummer entspricht. In dieser Funktion werden die beiden Register ds und es so eingestellt, dass sie auf den Kernelraum verweisen. Auf diese Weise können wir keine Daten vom Benutzermodus in den Kernelmodus übertragen (z. B. in open(const char * filename, int flag, ...) befindet sich die Adresse der Zeichenfolge, auf die der Dateinamenzeiger zeigt, im Benutzerbereich. Wenn Wenn Sie sie von der entsprechenden Stelle im Kernelraum abrufen, existiert die Zeichenfolge überhaupt nicht. Was sollten Sie tun? Das fs-Register im Interrupt-Handler ist so eingestellt, dass es auf den Benutzerbereich zeigt, sodass das Problem gelöst ist.
In Systemaufrufen werden entsprechende Vorgänge ausgeführt, z. B. das Öffnen von Dateien, das Schreiben von Dateien usw.
Nach der Verarbeitung kehrt es zur Interrupt-Verarbeitungsfunktion zurück und der Rückgabewert wird im EAX-Register gespeichert.
Bei der Rückkehr zur API von der Interrupt-Verarbeitungsfunktion wird der Rückgabewert weiterhin im EAX-Register gespeichert. Zu diesem Zeitpunkt wird vom Kernelmodus in den Benutzermodus zurückgesetzt.
Erhalten Sie den Wert von eax in der API, treffen Sie entsprechende Beurteilungen und geben Sie unterschiedliche Werte zurück, um den Abschluss des Vorgangs anzuzeigen.
Im geschützten Modus gibt es verschiedene Interrupts und der Systemaufruf ist an die Interrupt-Nummer 0x80 gebunden. Wenn ein Systemaufruf aufgerufen werden soll, wird int 0x80 ausgelöst und die Interrupt-Verarbeitungsfunktion verwendet eax, um zu wissen, welchen Systemaufruf sie aufrufen möchte. Der Grund dafür ist, dass es zu viele Systemaufrufe gibt und nicht genügend Interrupt-Nummern vorhanden sind. Daher wird eine für die zentrale Verwaltung verwendet.
Im Betriebssystem gibt es eine Tabelle, in der die Adressen verschiedener Systemaufruffunktionen gespeichert werden. Diese Tabelle ist ein Array, sodass über Indizes auf die Adressen verschiedener Funktionen zugegriffen werden kann. Daher können eine Interrupt-Nummer + verschiedene Systemaufrufnummern zur Verwaltung mehrerer Systemaufrufe verwendet werden.
Das obige ist der detaillierte Inhalt vonEinführung in den Systemaufrufprozess unter Linux. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!