2013-09-27 6 views
16

In meiner Betriebssystemklasse werde ich gefragt, ob der Wechsel vom Benutzermodus zum Kernelmodus privilegiert ist. Dies ist nicht betriebssystemspezifisch. Zuerst dachte ich ja, aber es scheint wie ein großer Fang 22. Ich zu meinem Lehrbuch genannt:Wechsel vom Benutzermodus zum Kernelmodus

Die Hardware privilegierte Befehle nur in Kernel-Modus ausgeführt werden kann. ...

Die Anweisung zum Wechsel in den Kernel-Modus ist ein Beispiel für eine privilegierte -Anweisung.

Gagne, Greg; Abraham Silberschatz; Peter B. Galvin (2010-01-26). Betriebssystemkonzepte (S. 22). Wiley Höher Ed. Kindle Edition.

So starten wir im Benutzermodus. Um in den Kernel-Modus zu wechseln, ist eine privilegierte Anweisung erforderlich. Eine privilegierte Anweisung muss im Kernel-Modus ausgeführt werden, daher müssen wir in den Kernel-Modus wechseln, um den Wechsel in den Kernel-Modus zu ermöglichen.

Ich denke, das System erlaubt es einem Benutzer nicht, sich selbst in den Kernel-Modus zu wechseln, sondern es wird vom Kernel ausgeführt, wenn der Benutzer versucht, eine andere privilegierte Anweisung auszuführen. Ist das korrekt?

+0

Also ist es wirklich ein Tippfehler? – denis631

Antwort

6

Das ist ein Tippfehler in der 8. Auflage eingeführt und in der 9. gehalten. In der siebten Ausgabe, Seite 19, heißt es stattdessen:

„Die Anweisung in dem Benutzermodus schalten ein Beispiel für eine privilegierte Anweisung ist.“

Was deutlich macht viel mehr Sinn.

+1

Ich bin mir nicht so sicher. Die [Errata] (http://codex.cs.yale.edu/avi/os-book/OS7/os7c/online-dir/os7-errata.pdf) für die 7. Ausgabe zeigt deutlich, dass der 8. (und somit der 9.)) Ausgabe ist korrekt ... (Was bedeutet, dass es in der 7. Ausgabe als ein Fehler identifiziert wurde.) – Ephemera

+0

@ephemera Leute, die die Errata beibehalten, sind vermutlich Studenten. – atulgangwar

+1

Wie macht es mehr Sinn, dass das Umschalten in den Kernel-Modus keine Privilegien erfordert? (Jedes Programm kann es einfach tun?) – Rptk99

0

Im Benutzerland fordern Sie privilegierte Operationen über Systemaufrufe an den Kernel an, der bei Bedarf zum Kernel-Modus wechselt. Der Benutzer verwendet eine API, der Kernel führt die privilegierten Operationen aus.

3

Es gibt normalerweise als eine Reihe von Anweisungen, die nicht wirklich in den Kernel-Modus auf allgemeine Weise wechseln, sondern Systemdienste anfordern. Diese wechseln also in den Kernel-Modus, jedoch nur im Zusammenhang mit dem Aufruf einer Funktion, die vom Betriebssystem für den Aufruf durch den Benutzercode eingerichtet wurde.

In den meisten modernen Systemen wird sogar dies durch eine API-Schicht verdeckt, die eine bestimmte Funktion implementiert, die möglicherweise einen Betriebssystemaufruf wie oben ausführt.

Aber im Allgemeinen ist es wahr, dass Benutzercode nicht das Äquivalent von sagen kann "Von diesem Punkt an möchte ich im Kernel-Modus laufen".

+0

Das bedeutet also, dass es Anweisungen gibt, die in den Kernel-Modus wechseln, um einige andere Systemdienste aufzurufen, aber die Frage wird immer noch nicht beantwortet, IMO. Wenn der Wechsel in den Kernel-Modus eine privilegierte Anweisung ist, kann das niemand aus dem Benutzermodus tun, richtig? Völlig verwirrt ... – denis631

30

Im Benutzermodus können Sie nicht einfach in den Kernelmodus wechseln. Die Interaktion zwischen Benutzer und Kernel erfolgt über Systemaufrufe. Jeder Systemaufruf liefert einen definierten Dienst. Der Benutzer sendet den Dienstnamen (normalerweise eine Nummer) und die erforderlichen Parameter. Hier ist ein Beispiel aus der realen Welt, wie das gemacht wird. Es ist x86 AT & T Stil Assembler.

Es verschiebt den Namen des Systemaufrufs in das EAX-Register, den Zeiger auf die Parameter in das EBX-Register der CPU und gibt dann die Softwareunterbrechungsnummer 42 aus. Die Interruptbehandlung wird in den Kernelmodus wechseln. Die Interrupt-Nummer wird in der Interrupt Descriptor Table (IDT) nachgeschlagen und ruft die dort registrierte Funktion, den syscall-Handler, auf. Dieser Handler wird im Kernelmodus ausgeführt. Bei Rückkehr in den Benutzermodus wird der Code den Inhalt von EAX in die Variable ret verschieben.

pok_ret_t pok_do_syscall (pok_syscall_id_t syscall_id, pok_syscall_args_t* args) 
{ 
    pok_ret_t ret; 
    uint32_t args_addr; 
    uint32_t id; 

    args_addr = (uint32_t) args; 
    id  = (uint32_t) syscall_id; 

    asm volatile ("movl %1,%%eax \n\t" 
       "movl %2,%%ebx \n\t" 
       "int $42  \n\t" 
       "movl %%eax, %0 \n\t" 
       :"=g"(ret) 
       :"g"(id), "g"(args_addr) 
       : "%eax" , "%ebx" 
       ); 
    return ret; 
} 

Die OS Dev wiki ist ein guter Punkt um mehr darüber zu lesen.

Sie wechseln also nicht nur zum Kernel, sondern Sie können den Kernel bitten, etwas für Sie zu tun. Und dann sagt dir der Kernel, ob es gemacht wurde oder nicht.

+1

Das ist die richtige Antwort und hat mir sehr geholfen. Vielen Dank! –

+0

Ja das ist eine ausgezeichnete Antwort, aber was ist mit dem Modus Bit ... Wann ändert es sich ... –

+0

@BaradwajAryasomayajula Meinst du [CR0.pe] (http://wiki.osdev.org/CPU_Registers_x86#CR0) ? Warum ist das relevant für dich? Vielleicht ist das eine separate Frage. Ich kann Ihnen keine genaue Antwort geben, aber die Anweisung "int", die von der CPU ausgeführt wird, löst einen Interrupt aus, der den Wechsel in den Kernel-Modus auslöst. Vielleicht sollten Sie sich das [Intel Handbuch] (https://www-ssl.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html) für weitere Details ansehen. – Philipp