Was ist der Unterschied zwischen dem Kernel-Space und dem User-Space? Bedeuten Kernelspeicher, Kernel-Threads, Kernel-Prozesse und Kernel-Stack dasselbe? Warum brauchen wir diese Differenzierung?
142
Was ist der Unterschied zwischen dem Kernel-Space und dem User-Space? Bedeuten Kernelspeicher, Kernel-Threads, Kernel-Prozesse und Kernel-Stack dasselbe? Warum brauchen wir diese Differenzierung?
Antworten:
Die wirklich vereinfachte Antwort lautet, dass der Kernel im Kernelbereich und normale Programme im Benutzerbereich ausgeführt werden. Der Benutzerbereich ist im Grunde eine Form des Sandboxing - er schränkt Benutzerprogramme ein, damit sie nicht mit dem Speicher (und anderen Ressourcen) anderer Programme oder des Betriebssystemkerns in Konflikt geraten können. Dies schränkt ihre Fähigkeit ein, schlechte Dinge wie einen Absturz der Maschine zu tun (beseitigt sie jedoch normalerweise nicht vollständig).
Der Kernel ist der Kern des Betriebssystems. Normalerweise hat es vollen Zugriff auf alle Speicher- und Maschinenhardware (und alles andere auf der Maschine). Um den Computer so stabil wie möglich zu halten, möchten Sie normalerweise, dass nur der vertrauenswürdigste und am besten getestete Code im Kernelmodus / Kernelspeicher ausgeführt wird.
Der Stapel ist nur ein weiterer Teil des Speichers, daher ist er natürlich zusammen mit dem Rest des Speichers getrennt.
quelle
Der Direktzugriffsspeicher (RAM) kann logisch in zwei unterschiedliche Bereiche unterteilt werden, nämlich den Kernelraum und den Benutzerraum. ( Die physischen Adressen des RAM sind nicht nur die virtuellen Adressen , die alle von der MMU implementiert werden. )
Der Kernel läuft in dem Teil des Speichers, der dazu berechtigt ist. Auf diesen Teil des Speichers können die Prozesse der normalen Benutzer nicht direkt zugreifen, während der Kernel auf alle Teile des Speichers zugreifen kann. Um einen Teil des Kernels zugreifen, müssen die Benutzerprozesse die vordefinierte Systemaufrufe , dh verwenden
open
,read
,write
etc. Auch dieC
Bibliotheksfunktionen wieprintf
Anruf der Systemaufrufwrite
wiederum.Die Systemaufrufe fungieren als Schnittstelle zwischen den Benutzerprozessen und den Kernelprozessen. Die Zugriffsrechte werden auf den Kernelbereich gelegt, um zu verhindern, dass die Benutzer unwissentlich mit dem Kernel herumspielen.
Wenn also ein Systemaufruf auftritt, wird ein Software-Interrupt an den Kernel gesendet. Die CPU kann die Steuerung vorübergehend an die zugehörige Interrupt-Handler-Routine übergeben. Der durch den Interrupt angehaltene Kernelprozess wird fortgesetzt, nachdem die Interrupt-Handler-Routine ihren Job beendet hat.
quelle
Kernel Space & Virtual Space sind Konzepte des virtuellen Speichers. Dies bedeutet nicht, dass Ram (Ihr tatsächlicher Speicher) in Kernel & User Space unterteilt ist. Jeder Prozess erhält einen virtuellen Speicher, der in Kernel und Benutzerbereich unterteilt ist.
So heißt es: "Der Direktzugriffsspeicher (RAM) kann in zwei verschiedene Bereiche unterteilt werden, nämlich den Kernelraum und den Benutzerraum." ist falsch.
& in Bezug auf "Kernel Space vs User Space" Sache
Wenn ein Prozess erstellt wird und sein virtueller Speicher in einen Benutzerbereich und einen Kernelbereich unterteilt ist, enthält der Benutzerbereich Daten, Code, Stapel, Heap des Prozesses und der Kernelbereich enthält beispielsweise die Seitentabelle für den Prozess , Kernel-Datenstrukturen und Kernel-Code usw. Um den Kernel-Space-Code auszuführen, muss die Steuerung in den Kernel-Modus wechseln (unter Verwendung eines 0x80-Software-Interrupts für Systemaufrufe). Der Kernel-Stack wird grundsätzlich von allen Prozessen gemeinsam genutzt, die derzeit im Kernel-Space ausgeführt werden.
quelle
CPU-Ringe sind die klarste Unterscheidung
Im x86-geschützten Modus befindet sich die CPU immer in einem von 4 Ringen. Der Linux-Kernel verwendet nur 0 und 3:
Dies ist die schwierigste und schnellste Definition von Kernel vs. Userland.
Warum verwendet Linux die Ringe 1 und 2 nicht: CPU-Berechtigungsringe: Warum werden die Ringe 1 und 2 nicht verwendet?
Wie wird der aktuelle Ring ermittelt?
Der aktuelle Ring wird durch eine Kombination von:
Globale Deskriptortabelle: Eine speicherinterne Tabelle mit GDT-Einträgen, und jeder Eintrag verfügt über 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
Das Segment registriert CS, DS usw., die auf den Index eines Eintrags in der GDT verweisen.
CS = 0
Dies bedeutet beispielsweise, dass der erste Eintrag des GDT derzeit für den ausführenden Code aktiv ist.Was kann jeder Ring?
Der CPU-Chip ist physisch so aufgebaut, dass:
Ring 0 kann alles
Ring 3 kann nicht mehrere Anweisungen ausführen und in mehrere Register schreiben, insbesondere:
kann seinen eigenen Ring nicht ändern! Andernfalls könnte es sich auf Ring 0 setzen und Ringe wären nutzlos.
Mit anderen Worten, der aktuelle Segmentdeskriptor , der den aktuellen Ring bestimmt , kann nicht geändert werden .
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 das Ändern der Seitentabellen.
Dies verhindert, dass ein Prozess aus Sicherheits- / Programmiergründen den Speicher anderer Prozesse sieht.
Interrupt-Handler können nicht registriert werden. Diese werden durch Schreiben in Speicherorte 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 E / A-Anweisungen wie
in
und ausführen undout
verfügt daher über beliebige Hardwarezugriffe.Andernfalls wären beispielsweise Dateiberechtigungen nutzlos, wenn ein Programm direkt von der Festplatte lesen könnte.
Genauer gesagt dank Michael Petch : Es ist dem Betriebssystem tatsächlich möglich, E / A-Anweisungen auf Ring 3 zuzulassen, dies wird tatsächlich vom Task- Statussegment gesteuert .
Was nicht möglich ist, ist, dass sich Ring 3 die Erlaubnis dazu gibt, wenn er es überhaupt nicht hatte.
Linux verbietet es immer. 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 erste Programm in Ring 0 (gut, aber es ist eine gute Annäherung). Sie können sich dieses anfä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, z. B. in eine Datei schreiben, verwendet er eine Anweisung, die einen Interrupt generiert, z. B.
int 0x80
odersyscall
um den Kernel zu signalisieren. x86-64 Linux Syscall Hallo Welt Beispiel:kompilieren und ausführen:
GitHub stromaufwärts .
In diesem Fall ruft die CPU einen Interrupt-Callback-Handler auf, den der Kernel beim Booten registriert hat. Hier ist ein konkretes Baremetall-Beispiel, das einen Handler registriert und verwendet .
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. X86_64
Wenn der
exec
Systemaufruf verwendet wird (oder wenn der Kernel gestartet wird/init
), bereitet der Kernel die Register und den Speicher des neuen Userland-Prozesses vor, springt dann zum Einstiegspunkt und schaltet die CPU auf Ring 3Wenn das Programm versucht, etwas Unartiges wie das Schreiben in ein verbotenes Register oder eine Speicheradresse (wegen Paging) zu tun, ruft die CPU auch einen Kernel-Callback-Handler in Ring 0 auf.
Aber da das Benutzerland ungezogen war, könnte der Kernel den Prozess dieses Mal beenden oder ihm eine Warnung mit einem Signal geben.
Wenn der Kernel startet, richtet er eine Hardware-Uhr mit einer festen Frequenz ein, die regelmäßig Interrupts erzeugt.
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 Hauptvorteile:
Wie kann man damit herumspielen?
Ich habe ein Bare-Metal-Setup erstellt, mit dem sich Ringe direkt manipulieren lassen: 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 werden Linux-Kernelmodule in Ring 0 ausgeführt, sodass Sie sie zum Ausprobieren privilegierter Operationen verwenden können, z. B. zum Lesen der Steuerregister: Wie kann man von einem Programm aus auf die Steuerregister cr0, cr2, cr3 zugreifen? Segmentierungsfehler erhalten
Hier ist ein praktisches QEMU + Buildroot-Setup mit dem Sie es ausprobieren können, ohne Ihren Host zu töten.
Der Nachteil von Kernelmodulen ist, dass andere kthreads ausgeführt werden und Ihre Experimente beeinträchtigen können. Theoretisch können Sie jedoch alle Interrupt-Handler mit Ihrem Kernelmodul übernehmen und das System besitzen, das wäre eigentlich ein interessantes Projekt.
Negative Ringe
Während im Intel-Handbuch nicht auf negative Ringe verwiesen wird, gibt es tatsächlich CPU-Modi, die über weitere Funktionen als Ring 0 selbst verfügen und daher gut zum Namen "negativer Ring" passen.
Ein Beispiel ist der in der Virtualisierung verwendete Hypervisor-Modus.
Für weitere Details siehe:
ARM
In ARM werden die Ringe stattdessen als Ausnahmeebenen bezeichnet, aber die Hauptideen bleiben dieselben.
In ARMv8 gibt es 4 Ausnahmestufen, die häufig verwendet werden als:
EL0: Benutzerland
EL1: Kernel ("Supervisor" in der ARM-Terminologie).
Eingetragen mit der
svc
Anweisung (SuperVisor Call), die zuvor alsswi
vor der einheitlichen Assembly bekannt war. Diese Anweisung wird zum Ausführen von Linux-Systemaufrufen verwendet. Hallo Welt ARMv8 Beispiel:hallo.S
GitHub stromaufwärts .
Testen Sie es mit QEMU unter Ubuntu 16.04:
Hier ist ein konkretes Baremetall-Beispiel, das einen SVC-Handler registriert und einen SVC-Aufruf ausführt .
EL2: Hypervisoren , zum Beispiel Xen .
Eingetragen mit der
hvc
Anweisung (HyperVisor Call).Ein Hypervisor ist für ein Betriebssystem, was ein Betriebssystem für Userland ist.
Mit Xen können Sie beispielsweise mehrere Betriebssysteme wie Linux oder Windows gleichzeitig auf demselben System ausführen und die Betriebssysteme aus Sicherheits- und Debug-Gründen voneinander isolieren, genau wie Linux dies für Userland-Programme tut.
Hypervisoren sind ein wichtiger Bestandteil der heutigen Cloud-Infrastruktur: Sie ermöglichen die Ausführung mehrerer Server auf einer einzigen Hardware, halten die Hardware-Auslastung immer nahe 100% und sparen viel Geld.
AWS beispielsweise verwendete Xen bis 2017, als der Wechsel zu KVM die Nachricht verbreitete .
EL3: noch ein Level. TODO Beispiel.
Eingetragen mit der
smc
Anweisung (Secure Mode Call)Das Referenzmodell für die ARMv8-Architektur DDI 0487C.a - Kapitel D1 - Das Programmierermodell auf AArch64-Systemebene - Abbildung D1-1 veranschaulicht dies auf wunderbare Weise:
Die ARM-Situation hat sich mit dem Aufkommen von ARMv8.1 Virtualization Host Extensions (VHE) ein wenig geändert . Mit dieser Erweiterung kann der Kernel effizient in EL2 ausgeführt werden:
VHE wurde entwickelt, weil In-Linux-Kernel-Virtualisierungslösungen wie KVM gegenüber Xen an Boden gewonnen haben (siehe z. B. die oben erwähnte Umstellung von AWS auf KVM), da die meisten Clients nur Linux-VMs benötigen und, wie Sie sich vorstellen können, alles in einem einzigen sind Projekt ist KVM einfacher und möglicherweise effizienter als Xen. In diesen Fällen fungiert nun der Linux-Kernel des Hosts als Hypervisor.
Beachten Sie, dass ARM, möglicherweise aufgrund des Vorteils der Rückschau, 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 folgender
MRS
Anweisung abgefragt werden : Was ist der aktuelle Ausführungsmodus / Ausnahmestufe usw.?ARM erfordert nicht, dass alle Ausnahmestufen vorhanden sind, um Implementierungen zu ermöglichen, bei denen die Funktion zum Speichern des Chipbereichs nicht erforderlich ist. ARMv8 "Ausnahmestufen" sagt:
QEMU zum Beispiel ist standardmäßig EL1, aber EL2 und EL3 können mit Befehlszeilenoptionen aktiviert werden: qemu-system-aarch64 gibt el1 ein, wenn a53 eingeschaltet wird
Code-Snippets, die unter Ubuntu 18.10 getestet wurden.
quelle
Kernel Space und User Space ist die Trennung der privilegierten Betriebssystemfunktionen und der eingeschränkten Benutzeranwendungen. Die Trennung ist erforderlich, um zu verhindern, dass Benutzeranwendungen Ihren Computer durchsuchen. Es wäre eine schlechte Sache, wenn ein altes Benutzerprogramm zufällige Daten auf Ihre Festplatte schreiben oder Speicher aus dem Speicher eines anderen Benutzerprogramms lesen könnte.
User Space-Programme können nicht direkt auf Systemressourcen zugreifen, sodass der Zugriff im Namen des Programms vom Betriebssystemkernel ausgeführt wird. Die User-Space-Programme stellen solche Anforderungen normalerweise über Systemaufrufe an das Betriebssystem.
Kernel-Threads, Prozesse und Stacks bedeuten nicht dasselbe. Sie sind analoge Konstrukte für den Kernelraum als ihre Gegenstücke im Benutzerraum.
quelle
Jeder Prozess verfügt über einen eigenen virtuellen Speicher von 4 GB, der über Seitentabellen dem physischen Speicher zugeordnet wird. Der virtuelle Speicher besteht hauptsächlich aus zwei Teilen: 3 GB für die Verwendung des Prozesses und 1 GB für die Verwendung des Kernels. Die meisten von Ihnen erstellten Variablen befinden sich im ersten Teil des Adressraums. Dieser Teil wird als Benutzerbereich bezeichnet. Im letzten Teil befindet sich der Kernel und ist für alle Prozesse gleich. Dies wird als Kernel-Speicherplatz bezeichnet, und der größte Teil dieses Speicherplatzes wird den Startpositionen des physischen Speichers zugeordnet, an denen das Kernel-Image beim Booten geladen wird.
quelle
Die maximale Größe des Adressraums hängt von der Länge des Adressregisters auf der CPU ab.
Auf Systemen mit 32-Bit-Adressregistern beträgt die maximale Größe des Adressraums 2 32 Byte oder 4 GiB. In ähnlicher Weise können auf 64-Bit-Systemen 2 64 Bytes adressiert werden.
Ein solcher Adressraum wird als virtueller Speicher oder virtueller Adressraum bezeichnet . Es hängt nicht wirklich mit der physischen RAM-Größe zusammen.
Auf Linux-Plattformen ist der virtuelle Adressraum in Kernelraum und Benutzerraum unterteilt.
Eine architekturspezifische Konstante, die als Taskgrößenbeschränkung bezeichnet wird , oder
TASK_SIZE
markiert die Position, an der die Aufteilung erfolgt:Der Adressbereich von 0 bis
TASK_SIZE
-1 wird dem Benutzerraum zugewiesen.Der Rest von
TASK_SIZE
bis zu 2 32 -1 (oder 2 64 -1) wird dem Kernelraum zugewiesen.Auf einem bestimmten 32-Bit-System könnten beispielsweise 3 GiB für den Benutzerraum und 1 GiB für den Kernelraum belegt sein.
Jede Anwendung / jedes Programm in einem Unix-ähnlichen Betriebssystem ist ein Prozess. Jeder von ihnen hat eine eindeutige Kennung, die als Prozesskennung (oder einfach als Prozess-ID , dh PID) bezeichnet wird. Linux bietet zwei Mechanismen zum Erstellen eines Prozesses: 1. den
fork()
Systemaufruf oder 2. denexec()
Aufruf.Ein Kernel-Thread ist ein einfacher Prozess und auch ein Programm, das gerade ausgeführt wird. Ein einzelner Prozess kann aus mehreren Threads bestehen, die dieselben Daten und Ressourcen gemeinsam nutzen, jedoch unterschiedliche Pfade durch den Programmcode nehmen. Linux bietet einen
clone()
Systemaufruf zum Generieren von Threads.Beispielanwendungen von Kernel-Threads sind: Datensynchronisation des RAM, Unterstützung des Schedulers bei der Verteilung von Prozessen auf CPUs usw.
quelle
Kurz gesagt: Der Kernel wird im Kernel Space ausgeführt. Der Kernel Space hat vollen Zugriff auf den gesamten Speicher und die Ressourcen. Sie können sagen, dass der Speicher in zwei Teile unterteilt ist: Teil für Kernel und Teil für benutzereigenen Prozess. (User Space) führt normale Programme aus Der Speicherplatz kann nicht direkt auf den Kernelspeicherplatz zugreifen, sodass der Kernel die Verwendung von Ressourcen anfordert. per syscall (vordefinierter Systemaufruf in glibc)
Es gibt eine Aussage, die die verschiedenen " User Space ist nur eine Testlast für den Kernel " vereinfacht ...
Um es ganz klar auszudrücken: Die Prozessorarchitektur ermöglicht es der CPU, im Zwei-Modus, dem Kernel-Modus und dem Benutzermodus , zu arbeiten. Der Hardware-Befehl ermöglicht das Umschalten von einem Modus in den anderen.
Speicher kann als Teil des Benutzer- oder Kernelbereichs markiert werden.
Wenn die CPU im Benutzermodus ausgeführt wird, kann die CPU nur auf Speicher zugreifen, der sich im Benutzerbereich befindet, während die CPU versucht, auf den Speicher im Kernelbereich zuzugreifen. Das Ergebnis ist eine "Hardware-Ausnahme". Wenn die CPU im Kernelmodus ausgeführt wird, kann die CPU direkt darauf zugreifen sowohl zum Kernel-Space als auch zum User-Space ...
quelle
Der Kernelraum bedeutet, dass ein Speicherraum nur vom Kernel berührt werden kann. Unter 32-Bit-Linux ist es 1G (von 0xC0000000 bis 0xffffffff als virtuelle Speicheradresse). Jeder vom Kernel erstellte Prozess ist auch ein Kernel-Thread. Für einen Prozess gibt es also zwei Stapel: einen Stapel im Benutzerbereich für diesen Prozess und einen anderen im Kernel Platz für Kernel-Thread.
Der Kernel-Stack belegte 2 Seiten (8 KB unter 32-Bit-Linux), enthielt einen task_struct (ca. 1 KB) und den realen Stack (ca. 7 KB). Letzteres wird verwendet, um einige automatische Variablen oder Funktionsaufrufparameter oder Funktionsadressen in Kernelfunktionen zu speichern. Hier ist der Code (Processor.h (linux \ include \ asm-i386)):
__get_free_pages (GFP_KERNEL, 1)) bedeutet, Speicher als 2 ^ 1 = 2 Seiten zuzuweisen.
Aber der Prozessstapel ist eine andere Sache, seine Adresse ist nur unter 0xC0000000 (32-Bit-Linux), die Größe kann ziemlich größer sein und wird für die Funktionsaufrufe des Benutzerraums verwendet.
Hier ist also eine Frage für den Systemaufruf: Er wird im Kernel ausgeführt, wurde aber vom Prozess im Benutzerbereich aufgerufen. Wie funktioniert er? Wird Linux seine Parameter und Funktionsadresse in den Kernel-Stack oder den Prozess-Stack stellen? Linux-Lösung: Alle Systemaufrufe werden durch Software-Unterbrechung INT 0x80 ausgelöst. In entry.S (linux \ arch \ i386 \ kernel) definiert, sind hier einige Zeilen zum Beispiel:
quelle
Von Sunil Yadav auf Quora:
quelle
IN Short Kernel Space ist der Teil des Speichers, in dem der Linux-Kernel ausgeführt wird (oberster virtueller Speicherplatz von 1 GB bei Linux), und User Space ist der Teil des Arbeitsspeichers, in dem die Benutzeranwendung ausgeführt wird (unter 3 GB virtueller Speicher bei Linux. Wenn Sie Willst du mehr wissen, siehe den unten angegebenen Link :)
http://learnlinuxconcepts.blogspot.in/2014/02/kernel-space-and-user-space.html
quelle
Ich versuche eine sehr vereinfachte Erklärung zu geben
Der virtuelle Speicher ist in den Kernelbereich und den Benutzerbereich unterteilt. Der Kernelbereich ist der Bereich des virtuellen Speichers, in dem Kernelprozesse ausgeführt werden, und der Benutzerbereich ist der Bereich des virtuellen Speichers, in dem Benutzerprozesse ausgeführt werden.
Diese Unterteilung ist für den Speicherzugriffsschutz erforderlich.
Wenn ein Bootloader einen Kernel startet, nachdem er an einen Speicherort im RAM geladen wurde (normalerweise auf einem ARM-basierten Controller), muss er sicherstellen, dass sich der Controller im Supervisor-Modus befindet und FIQs und IRQs deaktiviert sind.
quelle
Kernel Space und User Space sind logische Räume.
Die meisten modernen Prozessoren sind so konzipiert, dass sie in verschiedenen privilegierten Modi ausgeführt werden. x86-Computer können in 4 verschiedenen privilegierten Modi ausgeführt werden.
Und eine bestimmte Maschinenanweisung kann ausgeführt werden, wenn sie sich in / über einem bestimmten privilegierten Modus befindet.
Aufgrund dieses Designs bieten Sie einen Systemschutz oder Sandboxing für die Ausführungsumgebung.
Der Kernel ist ein Code, der Ihre Hardware verwaltet und die Systemabstraktion bereitstellt. Es muss also Zugriff auf alle Maschinenanweisungen haben. Und es ist die vertrauenswürdigste Software. Also sollte ich mit dem höchsten Privileg hingerichtet werden. Und Ring Level 0 ist der privilegierteste Modus. Daher wird Ring Level 0 auch als Kernel-Modus bezeichnet .
Benutzeranwendungen sind Software, die von Drittanbietern stammt und denen Sie nicht vollständig vertrauen können. Jemand mit böswilliger Absicht kann einen Code zum Absturz Ihres Systems schreiben, wenn er vollständigen Zugriff auf alle Maschinenanweisungen hat. Daher sollte der Anwendung Zugriff auf begrenzte Anweisungen gewährt werden. Und Ring Level 3 ist der am wenigsten privilegierte Modus. Ihre gesamte Anwendung wird also in diesem Modus ausgeführt. Daher wird dieser Ring Level 3 auch als Benutzermodus bezeichnet .
Hinweis: Ich erhalte keine Ringstufen 1 und 2. Es handelt sich im Grunde genommen um Modi mit Zwischenberechtigungen. Möglicherweise werden Gerätetreibercodes mit diesem Privileg ausgeführt. AFAIK, Linux verwendet nur Ring Level 0 und 3 für die Kernel-Code-Ausführung bzw. die Benutzeranwendung.
Daher kann jede Operation, die im Kernelmodus ausgeführt wird, als Kernelraum betrachtet werden. Und jede Operation, die im Benutzermodus ausgeführt wird, kann als Benutzerbereich betrachtet werden.
quelle
Die richtige Antwort lautet: Es gibt keinen Kernel- und Benutzerbereich. Der Prozessorbefehlssatz verfügt über spezielle Berechtigungen zum Festlegen destruktiver Elemente wie dem Stammverzeichnis der Seitentabellenzuordnung oder dem Zugriff auf den Speicher des Hardwaregeräts usw.
Kernel-Code hat die höchsten Berechtigungen und Benutzercode die niedrigsten. Dies verhindert, dass Benutzercode das System zum Absturz bringt, andere Programme ändert usw.
Im Allgemeinen wird der Kernelcode unter einer anderen Speicherzuordnung als der Benutzercode gespeichert (genauso wie Benutzerbereiche in anderen Speicherzuordnungen als die anderen gespeichert werden). Hierher kommen die Begriffe "Kernel Space" und "User Space". Aber das ist keine feste Regel. Da der x86 beispielsweise indirekt erfordert, dass seine Interrupt- / Trap-Handler jederzeit zugeordnet werden, muss ein Teil (oder einige Betriebssysteme alle) des Kernels dem Benutzerbereich zugeordnet werden. Dies bedeutet wiederum nicht, dass dieser Code über Benutzerrechte verfügt.
Warum ist die Trennung zwischen Kernel und Benutzer notwendig? Einige Designer sind sich nicht einig, dass dies tatsächlich notwendig ist. Die Mikrokernel-Architektur basiert auf der Idee, dass die Codeabschnitte mit den höchsten Berechtigungen so klein wie möglich sein sollten, wobei alle wichtigen Vorgänge im Code mit Benutzerberechtigungen ausgeführt werden sollten. Sie müssten untersuchen, warum dies eine gute Idee sein könnte, es ist kein einfaches Konzept (und es ist berühmt dafür, Vor- und Nachteile zu haben).
quelle
Das Gedächtnis wird in zwei verschiedene Bereiche unterteilt:
Prozesse, die unter dem Benutzerbereich ausgeführt werden, haben nur Zugriff auf einen begrenzten Teil des Speichers, während der Kernel Zugriff auf den gesamten Speicher hat. Prozesse, die im Benutzerbereich ausgeführt werden, haben auch keinen Zugriff auf den Kernelbereich. User Space-Prozesse können nur über eine vom Kernel bereitgestellte Schnittstelle - die Systemaufrufe - auf einen kleinen Teil des Kernels zugreifen. Wenn ein Prozess einen Systemaufruf ausführt, wird ein Software-Interrupt an den Kernel gesendet, der dann den entsprechenden Interrupt-Handler sendet und fortfährt seine Arbeit, nachdem der Handler beendet ist.
quelle
Unter Linux gibt es zwei Leerzeichen: 1. ist Benutzerbereich und ein anderer ist Kernraum. Der Benutzerbereich besteht nur aus der Benutzeranwendung, die Sie ausführen möchten. Als kernaler Dienst gibt es Prozessverwaltung, Dateiverwaltung, Signalverarbeitung, Speicherverwaltung, Threadverwaltung und so viele Dienste sind dort vorhanden. Wenn Sie die Anwendung über den Benutzerbereich ausführen, interagiert diese Anwendung nur mit dem Kernal-Dienst. und dieser Dienst interagiert mit dem Gerätetreiber, der zwischen Hardware und Kern vorhanden ist. Der Hauptvorteil der Trennung von Kernraum und Benutzerraum besteht darin, dass wir durch die virus.bcaz eine Sicherheit aller im Benutzerraum vorhandenen Benutzeranwendungen erreichen können und der Dienst im Kernraum vorhanden ist. Deshalb wirkt sich Linux nicht auf den Virus aus.
quelle