wake-up-neo.com

Was ist der Unterschied zwischen Benutzer- und Kernelmodus in Betriebssystemen?

Was sind die Unterschiede zwischen dem Benutzermodus und dem Kernelmodus, warum und wie wird einer von beiden aktiviert und welche Anwendungsfälle gibt es?

93
Alex
  1. Kernel-Modus

    Im Kernelmodus hat der ausführende Code vollständigen und uneingeschränkten Zugriff auf die zugrunde liegende Hardware. Es kann jeden CPU-Befehl ausführen und auf jede Speicheradresse verweisen. Der Kernel-Modus ist im Allgemeinen für die vertrauenswürdigsten Funktionen der untersten Ebene des Betriebssystems reserviert. Abstürze im Kernelmodus sind katastrophal. Sie werden den gesamten PC anhalten.

  2. Benutzermodus

    Im Benutzermodus kann der ausführende Code nicht direkt auf Hardware oder Referenzspeicher zugreifen. Code, der im Benutzermodus ausgeführt wird, muss an System-APIs delegiert werden, um auf Hardware oder Speicher zuzugreifen. Aufgrund des Schutzes, den diese Art der Isolierung bietet, können Abstürze im Benutzermodus immer wiederhergestellt werden. Der Großteil des auf Ihrem Computer ausgeführten Codes wird im Benutzermodus ausgeführt.

Weiterlesen

Grundlegendes zum Benutzer- und Kernelmodus

131
rahul

Dies sind zwei verschiedene Modi, in denen Ihr Computer arbeiten kann. Zuvor, wenn Computer wie ein großer Raum waren und etwas abstürzt, wird der gesamte Computer angehalten. Also entscheiden sich Computerarchitekten, dies zu ändern. Moderne Mikroprozessoren implementieren in Hardware mindestens 2 verschiedene Zustände.

Benutzermodus:

  • modus, in dem alle Benutzerprogramme ausgeführt werden. Es hat keinen Zugriff auf RAM und Hardware. Der Grund dafür ist, dass alle Programme, die im Kernelmodus ausgeführt werden, den Speicher des jeweils anderen überschreiben können Diese Funktionen stellen einen Aufruf der zugrunde liegenden API dar. Jeder von Windows gestartete Prozess mit Ausnahme des Systemprozesses wird im Benutzermodus ausgeführt.

Kernelmodus:

  • modus, in dem alle Kernel-Programme ausgeführt werden (verschiedene Treiber). Es hat Zugriff auf alle Ressourcen und die zugrunde liegende Hardware. Jeder CPU-Befehl kann ausgeführt werden und auf jede Speicheradresse kann zugegriffen werden. Dieser Modus ist für Treiber reserviert, die auf der niedrigsten Ebene arbeiten

Wie erfolgt der Wechsel?.

Der Wechsel vom Benutzermodus in den Kernelmodus erfolgt nicht automatisch durch die CPU. Die CPU wird durch Interrupts (Timer, Tastatur, E/A) unterbrochen. Wenn ein Interrupt auftritt, stoppt die CPU die Ausführung des aktuellen Programms, wechselt in den Kernel-Modus und führt den Interrupt-Handler aus. Dieser Handler speichert den Zustand der CPU, führt seine Operationen aus, stellt den Zustand wieder her und kehrt in den Benutzermodus zurück.

http://en.wikibooks.org/wiki/Windows_Programming/User_Mode_vs_Kernel_Mode

http://tldp.org/HOWTO/KernelAnalysis-HOWTO-3.html

http://en.wikipedia.org/wiki/Direct_memory_access

http://en.wikipedia.org/wiki/Interrupt_request

45
Salvador Dali

Ein Prozessor auf einem Computer unter Windows verfügt über zwei verschiedene Modi: Benutzermodus und Kernelmodus. Der Prozessor wechselt zwischen den beiden Modi, je nachdem, welche Art von Code auf dem Prozessor ausgeführt wird. Anwendungen werden im Benutzermodus ausgeführt, und Kernbetriebssystemkomponenten werden im Kernelmodus ausgeführt. Während viele Treiber im Kernelmodus ausgeführt werden, werden einige Treiber möglicherweise im Benutzermodus ausgeführt.

Wenn Sie eine Anwendung im Benutzermodus starten, erstellt Windows einen Prozess für die Anwendung. Der Prozess stellt der Anwendung einen privaten virtuellen Adressraum und eine private Handle-Tabelle zur Verfügung. Da der virtuelle Adressraum einer Anwendung privat ist, kann eine Anwendung keine Daten ändern, die zu einer anderen Anwendung gehören. Jede Anwendung wird isoliert ausgeführt. Wenn eine Anwendung abstürzt, ist der Absturz auf diese eine Anwendung beschränkt. Andere Anwendungen und das Betriebssystem sind vom Absturz nicht betroffen.

Der virtuelle Adressraum einer Anwendung im Benutzermodus ist nicht nur privat, sondern auch begrenzt. Ein Prozessor, der im Benutzermodus ausgeführt wird, kann nicht auf virtuelle Adressen zugreifen, die für das Betriebssystem reserviert sind. Durch die Einschränkung des virtuellen Adressraums einer Anwendung im Benutzermodus wird verhindert, dass die Anwendung wichtige Betriebssystemdaten ändert und möglicherweise beschädigt.

Der gesamte Code, der im Kernelmodus ausgeführt wird, verwendet einen einzigen virtuellen Adressraum. Dies bedeutet, dass ein Kernelmodustreiber nicht von anderen Treibern und dem Betriebssystem selbst isoliert ist. Wenn ein Kernelmodustreiber versehentlich an die falsche virtuelle Adresse schreibt, können Daten, die zum Betriebssystem oder zu einem anderen Treiber gehören, kompromittiert werden. Wenn ein Kernelmodustreiber abstürzt, stürzt das gesamte Betriebssystem ab.

Wenn Sie ein Windows-Benutzer sind, klicken Sie einmal auf diesen Link, um weitere Informationen zu erhalten.

Kommunikation zwischen Benutzermodus und Kernelmodus

8
Sangeen Khan

Ich nehme einen Stich in die Dunkelheit und denke, Sie sprechen über Windows. Kurz gesagt, der Kernelmodus hat vollen Zugriff auf Hardware, der Benutzermodus jedoch nicht. Beispielsweise werden viele, wenn nicht die meisten Gerätetreiber im Kernel-Modus geschrieben, weil sie genauere Details ihrer Hardware steuern müssen.

Siehe auch dieses Wikibook .

5
Mark Rushakoff

Andere Antworten haben bereits den Unterschied zwischen Benutzer- und Kernelmodus erklärt. Wenn Sie wirklich ins Detail gehen möchten, sollten Sie sich ein Exemplar von Windows Internals besorgen, einem hervorragenden Buch von Mark Russinovich und David Solomon beschreiben die Architektur und Details der verschiedenen Windows-Betriebssysteme.

3
Dirk Vollmar

CPU-Ringe sind die deutlichste Unterscheidung

Im x86-geschützten Modus befindet sich die CPU immer in einem von 4 Ringen. Der Linux-Kernel verwendet nur 0 und 3:

  • 0 für Kernel
  • 3 für Benutzer

Dies ist die härteste und schnellste Definition von Kernel vs Userland.

Warum verwendet Linux nicht die Ringe 1 und 2: CPU Privilege Rings: Warum werden die Ringe 1 und 2 nicht verwendet?

Wie wird der aktuelle Ring ermittelt?

Der aktuelle Ring wird ausgewählt durch eine Kombination von:

  • globale Deskriptortabelle: Eine speicherinterne Tabelle mit GDT-Einträgen, und jeder Eintrag enthält ein Feld Privl, das den Ring codiert.

    Der LGDT-Befehl setzt die Adresse auf die aktuelle Deskriptortabelle.

    Siehe auch: http://wiki.osdev.org/Global_Descriptor_Table

  • die Segmentregister CS, DS usw. zeigen auf den Index eines Eintrags in der GDT.

    Zum Beispiel bedeutet CS = 0, Dass der erste Eintrag des GDT für den ausführenden Code derzeit aktiv ist.

Was kann jeder Ring tun?

Der CPU-Chip ist physisch so aufgebaut, dass:

  • ring 0 kann alles

  • ring 3 kann nicht mehrere Befehle ausführen und in mehrere Register schreiben, insbesondere:

    • kann seinen eigenen Ring nicht ändern! Andernfalls könnte es sich selbst auf Ring 0 setzen und Ringe wären unbrauchbar.

      Mit anderen Worten, kann nicht den aktuellen Segment-Deskriptor ändern, der den aktuellen Ring bestimmt.

    • die Seitentabellen können nicht geändert werden: Wie funktioniert x86-Paging?

      Mit anderen Worten, das CR3-Register kann nicht geändert werden, und das Paging selbst verhindert die Änderung der Seitentabellen.

      Dies verhindert, dass ein Prozess den Speicher anderer Prozesse sieht, um die Sicherheit und die Programmierung zu vereinfachen.

    • interrupt-Handler können nicht registriert werden. Diese werden durch Schreiben in Speicherstellen konfiguriert, was auch durch Paging verhindert wird.

      Handler werden in Ring 0 ausgeführt und würden das Sicherheitsmodell beschädigen.

      Mit anderen Worten, kann die LGDT- und LIDT-Anweisungen nicht verwenden.

    • kann keine IO Anweisungen wie in und out ausführen und hat daher willkürliche Hardwarezugriffe.

      Andernfalls wären beispielsweise Dateiberechtigungen unbrauchbar, wenn ein Programm direkt von der Festplatte lesen könnte.

      Genauer gesagt dank Michael Petch : Es ist dem Betriebssystem tatsächlich möglich, IO Anweisungen auf Ring 3 zuzulassen, dies wird tatsächlich durch den Task-Status) gesteuert Segment .

      Was nicht möglich ist, ist, dass Ring 3 sich die Erlaubnis dazu gibt, wenn er es überhaupt nicht hat.

      Linux lässt es immer nicht zu. Siehe auch: Warum verwendet Linux den Hardware-Kontextschalter nicht über das TSS?

Wie wechseln Programme und Betriebssysteme zwischen Ringen?

  • wenn die CPU eingeschaltet ist, startet sie das Startprogramm in Ring 0 (na ja, aber es ist eine gute Annäherung). Sie können sich dieses ursprüngliche Programm als den Kernel vorstellen (aber normalerweise ist es ein Bootloader, der den Kernel dann noch in Ring 0 aufruft).

  • wenn ein Userland-Prozess möchte, dass der Kernel etwas dafür tut, wie das Schreiben in eine Datei, verwendet er eine Anweisung, die einen Interrupt wie int 0x80 erzeugt, um den Kernel zu signalisieren.

    In diesem Fall ruft die CPU den Callback-Handler auf und unterbricht ihn, den der Kernel beim Booten registriert hat.

    Dieser Handler wird in Ring 0 ausgeführt, der entscheidet, ob der Kernel diese Aktion zulässt, die Aktion ausführt und das Userland-Programm in Ring 3 neu startet.

  • wenn der Systemaufruf exec verwendet wird (oder wenn der Kernel startet /init ), bereitet der Kernel die Register und den Speicher vor des neuer Userland-Prozess, springt dann zum Einstiegspunkt und schaltet die CPU auf Ring 3

  • Wenn das Programm versucht, in ein verbotenes Register oder eine verbotene Speicheradresse zu schreiben (wegen Paging), ruft die CPU auch einen Kernel-Callback-Handler in Ring 0 auf.

    Aber da das Userland ungezogen war, könnte der Kernel den Prozess dieses Mal abbrechen oder ihm eine Warnung mit einem Signal geben.

  • Beim Booten des Kernels wird eine Hardware-Uhr mit einer festen Frequenz eingerichtet, die regelmäßig Interrupts generiert.

    Diese Hardware-Uhr generiert Interrupts, die Ring 0 ausführen, und ermöglicht es ihr, zu planen, welche Userland-Prozesse aufgeweckt werden sollen.

    Auf diese Weise kann die Planung auch dann erfolgen, wenn die Prozesse keine Systemaufrufe ausführen.

Was bringt es, mehrere Ringe zu haben?

Die Trennung von Kernel und Userland bietet zwei wesentliche Vorteile:

  • es ist einfacher, Programme zu erstellen, da Sie sicherer sind, dass das eine nicht in das andere eingreift. Beispielsweise muss sich ein Userland-Prozess nicht darum kümmern, den Speicher eines anderen Programms aufgrund von Paging zu überschreiben oder die Hardware für einen anderen Prozess in einen ungültigen Zustand zu versetzen.
  • es ist sicherer. Z.B. Dateiberechtigungen und Speicheraufteilung können verhindern, dass eine Hacking-App Ihre Bankdaten liest. Dies setzt natürlich voraus, dass Sie dem Kernel vertrauen.

Wie spielt man damit?

Ich habe ein Bare-Metal-Setup erstellt, mit dem Ringe direkt bearbeitet werden können: https://github.com/cirosantilli/x86-bare-metal-examples

Ich hatte leider nicht die Geduld, ein Userland-Beispiel zu erstellen, aber ich ging so weit wie das Paging-Setup, sodass Userland machbar sein sollte. Ich würde gerne eine Pull-Anfrage sehen.

Alternativ können Linux-Kernelmodule in Ring 0 ausgeführt werden, sodass Sie sie zum Testen privilegierter Vorgänge verwenden können, z. Lesen Sie die Steuerregister: Zugriff auf die Steuerregister cr0, cr2, cr3 aus einem Programm? Segmentierungsfehler

Hier ist ein praktisches QEMU + Buildroot-Setup , um es auszuprobieren, ohne Ihren Host zu töten.

Der Nachteil von Kernelmodulen ist, dass andere kthreads ausgeführt werden und Ihre Experimente stören können. Aber theoretisch können Sie alle Interrupt-Handler mit Ihrem Kernel-Modul übernehmen und das System besitzen, das wäre eigentlich ein interessantes Projekt.

Negative Ringe

Während negative Ringe im Intel-Handbuch eigentlich nicht erwähnt werden, gibt es CPU-Modi, die über weitere Funktionen als Ring 0 selbst verfügen und daher gut zum Namen "negativer Ring" passen.

Ein Beispiel ist der Hypervisor-Modus, der bei der Virtualisierung verwendet wird.

Weitere Informationen finden Sie unter: https://security.stackexchange.com/questions/129098/what-is-protection-ring-1

[~ # ~] Arm [~ # ~]

In ARM werden die Ringe stattdessen als Ausnahmestufen bezeichnet, die Hauptideen bleiben jedoch dieselben.

In ARMv8 gibt es 4 Ausnahmestufen, die üblicherweise verwendet werden als:

  • EL0: userland

  • EL1: Kernel

  • EL2: Hypervisor , zum Beispiel Xen .

    Ein Hypervisor ist für ein Betriebssystem, ein Betriebssystem für das Benutzerland.

    Mit Xen können Sie beispielsweise mehrere Betriebssysteme wie Linux oder Windows gleichzeitig auf demselben System ausführen und die Betriebssysteme aus Sicherheitsgründen und zur Vereinfachung des Debuggens voneinander isolieren, genau wie dies Linux für Userland-Programme tut.

    Hypervisoren sind ein wesentlicher Bestandteil der heutigen Cloud-Infrastruktur: Sie ermöglichen die Ausführung mehrerer Server auf einer einzigen Hardware, halten die Hardwarenutzung stets nahe bei 100% und sparen viel Geld.

    AWS verwendete Xen zum Beispiel bis 2017, als sein Umzug nach KVM machte die Nachrichten .

  • EL3: noch ein Level. TODO-Beispiel.

Das ARMv8-Architekturreferenzmodell DDI 0487C.a - Kapitel D1 - Das Modell des Programmierers auf Systemebene AArch64 - Abbildung D1-1 veranschaulicht dies auf hervorragende Weise:

enter image description here

Beachten Sie, dass ARM, möglicherweise aufgrund der Vorteile im Nachhinein, eine bessere Namenskonvention für die Berechtigungsstufen als x86 hat, ohne dass negative Stufen erforderlich sind: 0 ist die niedrigere und 3 die höchste. Höhere Ebenen werden in der Regel häufiger erstellt als niedrigere.

Die aktuelle EL kann mit der Anweisung MRS abgefragt werden: Was ist der aktuelle Ausführungsmodus/die aktuelle Ausnahmebedingungsstufe usw.?

Für ARM müssen nicht alle Ausnahmebedingungen vorhanden sein, um Implementierungen zu ermöglichen, bei denen die Funktion zum Einsparen von Chipfläche nicht erforderlich ist. ARMv8 "Ausnahmestufen" sagt:

Eine Implementierung enthält möglicherweise nicht alle Ausnahmestufen. Alle Implementierungen müssen EL0 und EL1 enthalten. EL2 und EL3 sind optional.

QEMU ist beispielsweise standardmäßig EL1, aber EL2 und EL3 können mit den folgenden Befehlszeilenoptionen aktiviert werden: qemu-system-aarch64 gibt el1 ein, wenn a53 beim Einschalten emuliert wird

Was

Grundsätzlich ist der Unterschied zwischen Kernel- und Benutzermodus nicht vom Betriebssystem abhängig und wird nur dadurch erreicht, dass einige Befehle durch Hardware-Design darauf beschränkt werden, nur im Kernelmodus ausgeführt zu werden. Alle anderen Zwecke wie der Speicherschutz können nur durch diese Einschränkung ausgeführt werden.

Wie

Dies bedeutet, dass sich der Prozessor entweder im Kernel-Modus oder im Benutzermodus befindet. Mithilfe einiger Mechanismen kann die Architektur sicherstellen, dass der Betriebssystemcode bei jedem Wechsel in den Kernel-Modus abgerufen und ausgeführt wird.

Warum

Mit dieser Hardware-Infrastruktur könnten diese in gängigen Betriebssystemen erreicht werden:

  • Schutz von Benutzerprogrammen vor dem Zugriff auf den gesamten Speicher, damit beispielsweise Programme das Betriebssystem nicht überschreiben können.
  • verhindern, dass Benutzerprogramme vertrauliche Anweisungen ausführen, z. B. solche, die die CPU-Speicherzeigergrenzen ändern, damit beispielsweise Programme ihre Speichergrenzen nicht überschreiten.
1
Ali Asgari