Wechsel vom Kernel-Modus zum Benutzermodus (und umgekehrt)

8

Ich lese das Betriebssystembuch von Galvin. Galvin erklärt, was sind Kernel- und Benutzermodi, Befehlsberechtigungen für beide Modi und auch über das Modusbit. Aber ich bin interessiert zu wissen, wie sich der Modus von einem zum anderen ändert. Grundsätzlich möchte ich folgende Frage lösen:

Eine CPU verfügt über zwei Modi: privilegiert und nicht privilegiert. Um den Modus von vorgeprägt auf nicht vorgezeichnet zu ändern

a) Ein Hardware-Interrupt wird benötigt

b) Ein Software-Interrupt wird benötigt.

c) Eine privilegierte Anweisung ist erforderlich.

d) Eine nicht privilegierte Anweisung ist erforderlich.

Von dem, was ich verstehe,

Vom Benutzermodus zum Kernelmodus - Hardware-Interrupt ist erforderlich [wie in Disk I / O]. Wenn das Benutzerprogramm Reifen benötigt, um auf einen Speicher zuzugreifen, der außerhalb seines zulässigen Bereichs liegt, tritt ein Trap auf, bei dem es sich im Grunde um einen Software-Interrupt handelt, der vom Betriebssystem behandelt wird. Jetzt können wir im Benutzermodus keine privilegierten Anweisungen ausführen. Daher kann eine nicht privilegierte Anweisung wie eine E / A-Anforderung den Benutzer in den Kernelmodus versetzen. Also denke ich, um mich zu ändern

von nicht privilegiert (Benutzer) zu privilegiert (Kernel) - H / W-Interrupt, S / W-Interrupt und nicht privilegierte Anweisungen reichen aus.

Kommen wir nun zum Kernel in den Benutzermodus. Das Betriebssystem kann den Kernel in den Benutzermodus ändern. Es wird einfach eine privilegierte Anweisung ausgeführt, um vom Kernel in den Benutzermodus zu wechseln. Es muss weder ein H / W- noch ein S / W-Interrupt generiert werden. Also schließe ich, um mich zu ändern

von vorgezogenen zu nicht vorgezogenen - eine privilegierte Anweisung reicht aus.

Habe ich recht ?

Auch bei der Ausführung im Kernel-Modus werden alle Interrupts deaktiviert, oder? Die Antwort kann also nicht (a) oder (b) sein. Da das Betriebssystem im Grunde eine Software ist, kann es keine H / W-Interrupts erzeugen.

Da das Betriebssystem selbst Interrupts verarbeitet, ist es für mich nicht sinnvoll, warum ein Interrupt generiert (und gewartet) werden muss, um vom Kernel in den Benutzermodus zu wechseln.

Bitte lassen Sie mich wissen, wenn ich irgendwo falsch liege. Jede Hilfe hierzu ist willkommen.

avi
quelle

Antworten:

7

Usermode zu Kernelmode: Falsch! ;-) Ja, Interrupts werden im Kernel-Modus verarbeitet, und ursprünglich wurde der Kernel-Modus durch einen Interrupt aktiviert, der irgendwie von der Software erzwungen wurde. Am DEC 2020 gab es eine Reihe von UIOs (Unimplemented Instruction Opcodes), die einen dieser Aufrufe aufriefen und eine Falle für das Betriebssystem verursachten. Sie enthielten Gleitkommaanweisungen (wenn nicht in Hardware) und andere exotische Anweisungen, aber auch die Mittel zum Ausführen von Betriebssystemaufrufen. Die i? 86-Familie hat die int(Interrupt-) Anweisung, die traditionell verwendet wird, wie Sie sagen. Neuere Familienmitglieder haben SYSTENT, um Supervisor-Anrufe effizienter zu erledigen. Die Möglichkeit, in den Supervisor-Modus zu wechseln, kann nicht privilegiert sein, sondern muss vom Kernel streng kontrolliert werden (wo Sie den Kernel eingeben, welche Argumente Sie übergeben, ...).

Kernelmode to usermode: Die Operation "drop privileges" muss nicht privilegiert sein. Wenn Sie keine Berechtigungen haben, ist das Löschen dieser Berechtigungen ein No-Op. Der genaue Mechanismus hängt jedoch extrem von der Architektur ab.

Im Kernel deaktivierte Interrupts: Interrupts weisen auf einen Zustand hin, der so schnell wie möglich behandelt werden muss (wenn beispielsweise die über das Netz eingetroffenen Daten nicht vor dem nächsten Eintreffen von der Karte gespeichert werden, werden sie überschrieben). Interrupts werden daher sehr selten deaktiviert. In ursprünglichen Unix-Systemen (und Zeitgenossen) gab es eine CPU, und der einfachste Weg, einen kritischen Bereich zu erhalten ("niemand verwirrt meine Daten, während ich sie ändere"), bestand darin, Interrupts zu deaktivieren. Es wurde versucht, die Strecken "Interrupt deaktiviert" aus den oben genannten Gründen so kurz wie möglich zu halten. Auf aktuellen Computern mit mehreren CPUs führt das Deaktivieren von Interrupts auf einer CPU nicht viel in diese Richtung. Das globale Deaktivieren von Interrupts ist bei der Koordination zwischen CPUs äußerst kostspielig und wird daher nicht (oder äußerst selten) durchgeführt.

vonbrand
quelle
"Die Operation" Löschen von Berechtigungen "muss nicht privilegiert sein". Sie möchten also sagen, dass eine nicht privilegierte Anweisung ausreicht, um vom Kernel in den Benutzermodus zu wechseln. Wenn es sich um eine nicht privilegierte Anweisung handelt, kann sie sogar ein Benutzer ausführen und vom Kernel in den Benutzermodus wechseln. Oder habe ich es falsch interpretiert?
Avi
Ja, ein "normaler Benutzer" kann einfach nicht in den Kernel-Modus wechseln. Außerdem kann das Löschen von Berechtigungen keinen Schaden anrichten, sodass es nicht (für sich) privilegiert sein muss. Wenn dies auf einem Computer zum Beispiel das Frobbing von privilegierten Registern bedeutet, wird es dort privilegiert. Aber es nicht haben zu privilegiert sein.
vonbrand
Ich verstehe es nicht richtig. Ihr vorheriger Kommentar und Ihre Antwort widersprechen sich. In einem Kommentar sagten Sie, "ein" normaler Benutzer "kann einfach nicht in den Kernel-Modus gelangen", aber als Antwort erwähnten Sie "Keine Notwendigkeit, die Operation" Löschrechte "zu privilegieren". Was fehlt mir? : S Um einfach zu sagen, um den Kernel in den Benutzermodus zu ändern, muss das Modusbit geändert werden. Was kann im Benutzermodus nicht richtig gemacht werden? Daher kann es sich nicht um eine nicht privilegierte Anweisung handeln.
Avi
Verdammt, ich habe auch nicht verstanden, warum der Benutzermodus zum Kernelmodus falsch ist? In Ihrer Erklärung können Sie in den ersten Zeilen, in denen Sie den Benutzer für den Kernel-Modus erwähnt haben, über INT-Anweisungen ausgeführt werden. Zuletzt haben Sie Folgendes erwähnt: "Die Möglichkeit, in den Supervisor-Modus zu wechseln, kann nicht privilegiert werden." Ist das nicht alles was ich erwähnt habe? H / W-Interrupt (was offensichtlich ist, z. B. E / A-Anforderungen), S / W-Interrupt (INT-Befehl) und nicht privilegierter Befehl.
Avi
Dies kann mit einem Interrupt erfolgen, es gibt jedoch auch andere Möglichkeiten. Es kann nicht privilegiert werden (wenn es so wäre, könnte es kein Benutzer tun ;-).
vonbrand