2016-07-13 13 views
2

Wie wechselt der Linux-Kernel zwischen Benutzermodus und Kernelmodus-Stack, wenn ein Systemaufruf oder ein Interrupt auftritt? Ich meine, was ist der genaue Mechanismus - was passiert mit dem Stack-Zeiger im Benutzermodus und woher kommt der Stack-Zeiger im Kernel-Modus? Was wird mit Hardware gemacht und was muss mit Software gemacht werden?Wie wechselt der Linux-Kernel zwischen Benutzermodus und Kernelmodus-Stack?

Antwort

3

Alle folgenden Wörter sind über x86.

Ich werde nur den gesamten syscall Pfad beschreiben, und diese Antwort wird die angeforderten Informationen enthalten.

Zunächst müssen Sie verstehen, was interrupt descriptor table ist. Diese Tabelle speichert Adressen von Ausnahmen/Unterbrechungsvektoren. Systemaufruf ist eine Ausnahme. Um einen Ausnahmebenutzercode auszulösen, führen Sie

int x 

Montageanleitung. Jede Ausnahme einschließlich Systemaufruf hat eine eigene Nummer. Auf x86-Linux wird diese aussehen

int 0x80 

Der int Befehl ein komplexer mehrstufiger Befehl ist. Hier ist eine Erklärung dessen, was es tut:

1.) Extrakte descriptor von IDT (IDT-Adresse in speziellen Register gespeichert) und überprüft, dass CPL < = DPL. CPL ist eine aktuelle Berechtigungsebene, die aus dem CS-Register gelesen werden kann. DPL wird im IDT-Deskriptor gespeichert. Als Konsequenz daraus - Sie können einige Ausnahmen (zB Seitenfehler) nicht direkt aus dem Benutzerbereich durch die Anweisung int erzeugen. Wenn Sie dies versuchen, erhalten Sie general protection exception

2.) Der Prozessor schaltet auf den in TSS definierten Stapel um. TSS wurde früher initialisiert und enthält bereits Werte von ESP und SS, die die Kernel-Stack-Adresse enthalten. Jetzt zeigt ESP auf den Kernel-Stack.

3.) Der Prozessor schiebt auf den neu geschalteten Kernel-Stack User Space Register: ss, esp, eflags, cs, eip. Wir müssen zurück, nachdem syscall bedient wurde, oder?

4.) Nächster Prozessorsatz CS und EIP vom IDT-Deskriptor. Diese Adresse definiert den Eintrittspunkt des Ausnahmevektors.

5.) Hier sind wir in der syscall Ausnahme Vektor im Kernel.


Und ein paar Worte über ARM. ARM hat kein TSS, es hat per-mode-Register gelandet. So haben Sie für SVC und USR-Modi separate Stapelzeiger. Wenn Sie daran interessiert sind, nehmen Sie an trap entry code

Interestring Links aussehen: MIT JOS lab 3, XV6 manual

+0

super hilfreich. Danke @ alex-hoppus – dsatish

Verwandte Themen