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
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
- 1. Gemeinsamer Speicher zwischen Benutzermodus und Kernel-Modus
- 2. Zweifache Interaktion zwischen der Benutzermodus-App und dem Kernelmodus-Treiber?
- 3. Zeitstempelzähler (TSC) beim Wechsel zwischen Kernel und Benutzermodus
- 4. Wie man zwischen JPanels in CardLayout wechselt?
- 5. Wie man einfach zwischen Dev- und Prod-Umgebungen wechselt
- 6. Rails, wie man zwischen Entwickler- und Produktionsmodus wechselt?
- 7. Wie man zwischen verstecken und Ansichtspasswort in ios wechselt?
- 8. Was kostet (in Zyklen) zwischen Windows Kernel und Benutzermodus?
- 9. Wie entscheidet Go, wann der Kontext zwischen den Goroutines wechselt?
- 10. CPU Wechselt vom Benutzermodus zum Kernelmodus: Was genau macht es? Wie macht es diesen Übergang?
- 11. PHP-Session-ID wechselt zwischen den Seiten
- 12. JButton, der bei Verwendung von CardLayout nicht zwischen Karten wechselt
- 13. ETW-Tracking von. NET, Benutzermodus und Treiber
- 14. Outlook-Objektbibliothek wechselt nicht zwischen Version 12 und 14
- 15. Warum Forms Design wechselt zwischen XP sp2 und XP sp3
- 16. Bootstrapper Application UI - Wie man zwischen den Seiten wechselt
- 17. Rückruffunktion im Benutzermodus und im Kernelmodus
- 18. Wie man zwischen zwei Bildern mit einer Taste wechselt Javascript
- 19. Wie man mit jQuery zwischen 2 CSS Farben wechselt?
- 20. Wechsel vom Benutzermodus zum Kernelmodus
- 21. Git - Best Practice: Wie man sehr oft zwischen Zweigen wechselt und multiple Commits vermeidet?
- 22. vom Benutzermodus auf ARMv7 (rpi2)
- 23. Wie wechselt Zusammenhang zwischen .NET Framework 4 und .net-Standard 1.5 für Task.Delay
- 24. Wie können Sie benachrichtigt werden, wenn der Benutzer zwischen Ansichten wechselt?
- 25. Was ist der Unterschied zwischen Kernel und User Mode Programmierung?
- 26. Chrome und Firefox Bootstrap nav wechselt nicht
- 27. Probleme bei der Kommunikation mit dem Treiber aus dem Benutzermodus
- 28. Wie man zwischen vertikalen Pillen und Tabs basierend auf der Bildschirmauflösung mit angular-ui-bootstrap richtig wechselt?
- 29. JTabbedPane wechselt nicht den Inhalt der Registerkarte
- 30. Wie kann ich die Vorbelegung meines Threads im Benutzermodus vermeiden?
super hilfreich. Danke @ alex-hoppus – dsatish