Wie funktioniert der kernel wissen, ob die CPU im user-Modus oder kenel-Modus?
Da läuft die CPU im user/kernel mode, ich möchte wissen, wie diese bestimmt wird vom kernel. Ich meine, wenn ein sys-Aufruf aufgerufen wird, der kernel führt es stellvertretend für den Prozess, aber wie funktioniert der kernel weiß, dass es die Ausführung im kernel-Modus?
- möglich, Duplikat der CPU-Switches, die vom Benutzermodus an den Kernelmodus übergeben werden : Was genau tut es? Wie funktioniert es, macht diesen übergang?
- vielleicht meinst du user-Kontext/Prozess-Kontext-vs-kernel-Kontext/interrupt-Kontext?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie feststellen, ob im user-Modus oder kernel-Modus-von der Berechtigungsstufe in das code-segment-register (CS). Jeder Anweisung in die CPU geladen aus dem Speicher gezeigt, durch den RIP oder das EIP-register (der instruction-pointer-register abhängig davon, ob Sie x86_64 oder x86 bzw.) Lesen aus dem segment beschrieben, die in der global descriptor table (GDT), die von der aktuellen code-segment-descriptor. Die unteren zwei bits des code-segment-descriptor bestimmt die aktuelle Berechtigungsebene, dass der code ausgeführt wird, an. Wenn ein Systemaufruf erfolgt ist, die typischerweise durch einen software-interrupt, die CPU überprüfen Sie die current privilege-level, und wenn es im user-Modus, im Tausch mit der aktuellen code-segment-descriptor für eine kernel-Ebene, bestimmt durch die syscall-die software-interrupt-gate-Deskriptor, als auch eine stack-switch und speichern Sie die aktuellen flags, die user-level-CS-Wert und der RIP-Wert für diese neuen kernel-level-stack. Wenn der Systemaufruf abgeschlossen ist, wird der Benutzer-Modus CS-Wert, flags, und der instruction pointer (EIP oder RIP) Wert sind wieder aus dem kernel-stack und stack-Schalter wird wieder auf die aktuelle Ausführung von Prozessen " stack.
The lower two-bits of the code segment descriptor
?Breit, wenn es läuft kernel-code im kernel-Modus. Der übergang vom user space in den kernel-Modus (z.B. für system call) bewirkt, dass ein Kontextwechsel auftreten. Als Teil dieser Kontextwechsel der CPU-Modus geändert wird.
Kernel-code nur ausgeführt wird, der im kernel-Modus. Es gibt keine Möglichkeit, kernel-code ausführen, der im user-Modus. Wenn die Anwendung ruft den system call, es generiert einen trap (software-interrupt) und den Modus-Schalter auf den kernel-mode und kernel-Implementierung der system call wird ausgeführt. Sobald es fertig ist, kernel wechseln Sie zurück zur Benutzer-Modus und Benutzer-Anwendung weiter Verarbeitung im Benutzer-Modus.
Der Begriff wird als "Superviser-Modus", die für x86 - /ARM-und viele andere Prozessor auch.
Lesen (das gilt nur für x86 CPU):
http://en.wikipedia.org/wiki/Ring_(computer_security)
Ring 0 bis 3 sind die verschiedenen Privilegien Ebene der x86 CPU. Normalerweise nur Ring0 und 3 verwendet werden (kernel-und user), aber heutzutage Ring 1 zu finden Nutzungen (z.B. VMWare verwendet, es zu emulieren Gastes Ausführung-ring-0). Nur Ring 0 hat die volle Berechtigung, einige privilegierte Befehle (wie lgdt oder lidt), und so einen guten test auf der assembly-Ebene ist natürlich die Ausführung dieser Anweisung, und sehen, ob Ihr Programm trifft auf jede Ausnahme oder nicht.
Lesen Sie diese, um wirklich identifizieren Sie Ihre aktuelle Berechtigungsebene (siehe auch CPL, die eine pictorialization von Jason ' s Antwort):
http://duartes.org/gustavo/blog/post/cpu-rings-privilege-and-protection
Es ist eine einfache Frage und es muss nicht jeder Experte Kommentar wie oben..
Sich die Frage, wie eine cpu kommen, zu wissen, ob es im kernel-Modus oder den ein-Benutzer-Modus.
Die Antwort ist das "mode bit"....
Es ist ein bit im Status-register der cpu-Registern eingestellt.
Wenn "Modus-bit=0",,,ist es als kernel-Modus(auch genannt,monitor-Modus,Modus privilegiert geschützten Modus...und viele andere...)
Wenn "Modus-bit=1",,es ist, als Benutzer-Modus...und der Benutzer kann nun seine persönlichen Anwendungen ohne speziellen kernel Unterbrechung.
so einfach...ist es nicht??