it-swarm.dev

Was ist der Unterschied zwischen dem Kernel Space und dem User Space?

Was ist der Unterschied zwischen dem Kernel Space und dem User Space? Bedeuten Kernel Space, Kernel-Threads, Kernel-Prozesse und Kernel-Stack dasselbe? Warum brauchen wir diese Unterscheidung?

124
kc3

Die vereinfachte Antwort von really lautet, dass der Kernel im Kernel-Space und normale Programme im User-Space laufen. Der Benutzerraum ist im Grunde eine Form des Sandboxens - er beschränkt Benutzerprogramme, so dass sie sich nicht mit dem Speicher (und anderen Ressourcen) ausstatten können, die anderen Programmen oder dem Betriebssystemkern gehören. Dies begrenzt (aber beseitigt diese normalerweise nicht vollständig), dass sie schlechte Dinge ausführen kann, beispielsweise einen Absturz der Maschine.

Der Kernel ist der Kern des Betriebssystems. Normalerweise hat er vollen Zugriff auf alle Speicher- und Maschinenhardware (und alles andere auf der Maschine). Um den Computer so stabil wie möglich zu halten, soll normalerweise nur der vertrauenswürdigste und getestete Code im Kernelmodus/Kernelbereich ausgeführt werden.

Der Stack ist nur ein weiterer Teil des Speichers. Daher wird er natürlich zusammen mit dem restlichen Speicher getrennt.

108
Jerry Coffin

Der Arbeitsspeicher (RAM) kann logisch in zwei verschiedene Bereiche unterteilt werden, nämlich den Kernel-Space und den User-Space. ( The Physische Adressen des RAM sind nicht wirklich geteilt, sondern nur die virtuellen Adressen , all dies implementiert durch das MMU )

Der Kernel läuft in dem Teil des Speichers, der dazu berechtigt ist. Auf diesen Teil des Speichers kann nicht direkt von den Prozessen der normalen Benutzer zugegriffen werden, während der Kernel auf alle Teile des Speichers zugreifen kann. Um auf einen Teil des Kernels zuzugreifen, müssen die Benutzerprozesse die vordefinierten Systemaufrufe verwenden, dh open, read, write usw. Auch die Bibliothek C funktioniert wie printf Rufen Sie den Systemaufruf write auf.

Die Systemaufrufe fungieren als Schnittstelle zwischen den Benutzerprozessen und den Kernelprozessen. Die Zugriffsrechte werden auf den Kernel-Bereich gelegt, um zu verhindern, dass die Benutzer unwissentlich Fehler mit dem Kernel machen.

Wenn also ein Systemaufruf auftritt, wird ein Software-Interrupt an den Kernel gesendet. Die CPU kann die Steuerung vorübergehend an die zugeordnete Interrupt-Handler-Routine übergeben. Der Kernelprozess, der durch den Interrupt angehalten wurde, wird fortgesetzt, nachdem die Interrupt-Handler-Routine ihren Job beendet hat.

61
Aquarius_Girl

Kernel Space & Virtual Space sind Konzepte des virtuellen Speichers .... es bedeutet nicht, dass Ram (Ihr tatsächlicher Speicher) in Kernel und User Space unterteilt ist. Jeder Prozess erhält virtuellen Speicher, der in Kernel und Kernel unterteilt ist. Benutzerraum.

Das heißt, "Der Direktzugriffsspeicher (RAM) kann in zwei verschiedene Bereiche unterteilt werden, nämlich den Kernelraum und den Benutzerraum." ist falsch.

& bezüglich "Kernel Space vs User Space"

Wenn ein Prozess erstellt wird und sein virtueller Speicher in einen Benutzerraum und einen Kernelraum unterteilt ist, enthält der Benutzerraumbereich Daten, Code, Stack, Heap des Prozesses und der Kernelraum enthält z. B. die Seitentabelle für den Prozess Kernel-Datenstrukturen und Kernel-Code usw. Um Kernel-Space-Code auszuführen, muss die Steuerung in den Kernel-Modus wechseln (unter Verwendung von 0x80-Software-Interrupt für Systemaufrufe). Der Kernel-Stack wird grundsätzlich von allen Prozessen gemeinsam genutzt, die derzeit im Kernel-Space ausgeführt werden.

21
Varun Sharma

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.

    Beispielsweise, CS = 0 bedeutet, dass der erste Eintrag der GDT derzeit für den ausführenden Code 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 erzeugt, wie z. B. int 0x80 oder syscall um den Kernel zu signalisieren. x86-64 Linux syscall hallo welt beispiel:

    .data
    hello_world:
        .ascii "hello world\n"
        hello_world_len = . - hello_world
    .text
    .global _start
    _start:
        /* write */
        mov $1, %rax
        mov $1, %rdi
        mov $hello_world, %rsi
        mov $hello_world_len, %rdx
        syscall
    
        /* exit */
        mov $60, %rax
        mov $0, %rdi
        syscall
    

    kompilieren und ausführen:

    as -o hello_world.o hello_world.S
    ld -o hello_world.out hello_world.o
    ./hello_world.out
    

    GitHub upstream .

    In diesem Fall ruft die CPU einen Interrupt-Callback-Handler auf, den der Kernel beim Booten registriert hat. Hier ist ein konkretes Baremetal-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 Systemaufruf exec verwendet wird (oder wenn der Kernel startet /init ), der Kernel bereitet die Register und den Speicher vor des neuen Userland-Prozesses, springt dann zum Einstiegspunkt und schaltet die CPU auf Ring 3

  • Wenn das Programm versucht, in ein unzulässiges Register oder eine unzulässige Speicheradresse zu schreiben (aufgrund von 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, festzulegen, 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 Kernel-Modulen ist, dass andere kthreads ausgeführt werden und Ihre Experimente stören können. Aber theoretisch können Sie mit Ihrem Kernel-Modul alle Interrupt-Handler ü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 ("Supervisor" in ARM Terminologie).

    Wird mit der Anweisung svc (SuperVisor-Aufruf) eingegeben, die zuvor als swivor Unified Assembly bezeichnet wurde. Dies ist die Anweisung, die zum Ausführen von Linux-Systemaufrufen verwendet wird. Hallo Welt ARMv8 Beispiel:

    .text
    .global _start
    _start:
        /* write */
        mov x0, 1
        ldr x1, =msg
        ldr x2, =len
        mov x8, 64
        svc 0
    
        /* exit */
        mov x0, 0
        mov x8, 93
        svc 0
    msg:
        .ascii "hello syscall v8\n"
    len = . - msg
    

    GitHub upstream .

    Testen Sie es mit QEMU unter Ubuntu 16.04:

    Sudo apt-get install qemu-user gcc-arm-linux-gnueabihf
    arm-linux-gnueabihf-as -o hello.o hello.S
    arm-linux-gnueabihf-ld -o hello hello.o
    qemu-arm hello
    

    Hier ist ein konkretes Baremetal-Beispiel, das registriert einen SVC-Handler und führt einen SVC-Aufruf durch .

  • EL2: Hypervisor , zum Beispiel Xen .

    Wird mit der Anweisung hvc (HyperVisor-Aufruf) eingegeben.

    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.

    Eingegeben mit der Anweisung smc (Secure Mode Call)

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

Code-Schnipsel getestet auf Ubuntu 18.10.

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 damit beginnen könnte, zufällige Daten auf die Festplatte zu schreiben oder den Speicher eines anderen Benutzerprogramms zu lesen.

Benutzerraumprogramme können nicht direkt auf Systemressourcen zugreifen, so dass der Zugriff des Betriebssystemkerns im Auftrag des Programms erfolgt. Die Benutzerraumprogramme stellen normalerweise solche Anforderungen des Betriebssystems über Systemaufrufe.

Kernthreads, Prozesse und Stacks bedeuten nicht dasselbe. Sie sind analoge Konstrukte für den Kernel-Space als ihre Gegenstücke im User-Space.

10
Dave Rager

Jeder Prozess verfügt über einen eigenen virtuellen Speicher von 4 GB, der durch Seitentabellen dem physischen Speicher zugeordnet wird. Der virtuelle Speicher ist zumeist in zwei Teile aufgeteilt: 3 GB für die Verwendung des Prozesses und 1 GB für die Verwendung des Kernels. Die meisten Variablen, die Sie erstellen, liegen im ersten Teil des Adressraums. Dieser Teil wird als User Space bezeichnet. Der letzte Teil ist der Ort, an dem sich der Kernel befindet, und ist für alle Prozesse gleich. Dies wird als Kernel-Space bezeichnet und der größte Teil dieses Space wird den Startpositionen des physischen Speichers zugeordnet, an denen das Kernel-Image beim Booten geladen wird.

7
pflz

Die maximale Größe des Adressraums hängt von der Länge des Adressregisters in der CPU ab.

Bei Systemen mit 32-Bit-Adressregistern beträgt die maximale Größe des Adressraums 232 Bytes oder 4 GiB . In ähnlicher Weise auf 64-Bit-Systemen 264 Bytes können angesprochen werden.

Ein solcher Adressraum wird als virtueller Speicher oder virtueller Adressraum bezeichnet. Es bezieht sich eigentlich nicht auf die physische RAM - Größe.

Auf Linux-Plattformen ist der virtuelle Adressraum in Kernel- und Benutzerraum unterteilt.

Eine architekturspezifische Konstante namens task size limit 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 232-1 oder 264-1) wird dem Kernel-Space zugewiesen.

Auf einem bestimmten 32-Bit-System können beispielsweise 3 GiB für den Benutzerplatz und 1 GiB für den Kernelraum belegt werden.

Jede Anwendung/jedes Programm in einem Unix-ähnlichen Betriebssystem ist ein Prozess. Jeder von ihnen hat einen eindeutigen Bezeichner namens Process Identifier (oder einfach Process ID, d. h. PID). Linux bietet zwei Mechanismen zum Erstellen eines Prozesses: 1. den Systemaufruf fork() oder 2. den Aufruf von exec().

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 sich die gleichen Daten und Ressourcen teilen, jedoch unterschiedliche Pfade durch den Programmcode nehmen. Linux bietet einen clone()-Systemaufruf zum Generieren von Threads.

Beispiele für Kernel-Threads sind: Datensynchronisierung des RAM, Unterstützung des Schedulers bei der Verteilung von Prozessen zwischen CPUs usw.

5

Kurz gesagt: Kernel läuft im Kernel Space, der Kernel Space hat vollen Zugriff auf alle Arbeitsspeicher und Ressourcen. Man kann sagen, dass der Speicher in zwei Teile aufgeteilt wird, einen Teil für den Kernel und einen Teil für den eigenen Prozess, (Benutzerraum) normale Programme, Benutzer Da der Speicherplatz nicht direkt auf den Kernel-Speicherplatz zugreifen kann, wird er vom Kernel aufgefordert, Ressourcen zu verwenden. von syscall (vordefinierter Systemaufruf in glibc)

es gibt eine Anweisung, die die verschiedenen "User Space" vereinfacht. Eine Testlast für den Kernel"... 

Um es ganz klar zu sagen: Die Prozessorarchitektur erlaubt es der CPU, in zwei Modi zu arbeiten: Kernel Mode und User Mode . Der Hardwarebefehl ermöglicht das Umschalten von einem Modus zum anderen.

speicher kann als Teil des Benutzer- oder Kernel-Bereichs markiert werden.

Wenn die CPU im Benutzermodus ausgeführt wird, kann die CPU nur auf Arbeitsspeicher zugreifen, der sich im Benutzerbereich befindet, während die CPU versucht, auf den Arbeitsspeicher im Kernel-Speicher zuzugreifen. Das Ergebnis ist eine "Hardware-Ausnahme". Wenn die CPU im Kernel-Modus läuft, kann die CPU direkt darauf zugreifen sowohl zum Kernel Space als auch zum User Space ...

Von Sunil Yadav, auf Quora:

Der Linux-Kern bezieht sich auf alles, was im Kernel-Modus läuft und .__ ist. besteht aus mehreren unterschiedlichen Schichten. Auf der untersten Ebene der Kernel interagiert mit der Hardware über die HAL. Auf der mittleren Ebene ist der Der UNIX-Kernel ist in 4 verschiedene Bereiche unterteilt. Der erste der vier Bereiche befasst sich mit Zeichengeräten, rohem und gekochtem TTY und Terminal Handhabung. Der zweite Bereich behandelt Netzwerkgerätetreiber, Routing Protokolle und Steckdosen. Der dritte Bereich behandelt Plattengerätetreiber Seiten- und Puffercaches, Dateisystem, virtueller Speicher, Dateinamen und Kartierung. Der vierte und letzte Bereich behandelt das Prozess-Dispatching Planung, Erstellung und Beendigung sowie Signalverarbeitung. Vor allem haben wir die oberste Schicht des Kernels, die .__ enthält. Systemaufrufe, Interrupts und Traps. Diese Ebene dient als Schnittstelle zu jeder der Funktionen der unteren Ebene. Ein Programmierer verwendet die verschiedenen Systemaufrufe und Interrupts, um mit den Funktionen zu interagieren des Betriebssystems.

2
Vijay Ram

Der Kernel-Bereich bedeutet, dass ein Speicherplatz nur vom Kernel berührt werden kann. Unter 32-Bit-Linux ist dies 1G (von 0xC0000000 bis 0xffffffff als Adresse für den virtuellen Speicher). Jeder durch den Kernel erstellte Prozess ist auch ein Kernel-Thread. Für einen Prozess gibt es zwei Stapel: einen Stapel im Benutzerraum für diesen Prozess und einen anderen im Kernel Platz für Kernel-Thread.

der Kernel-Stack belegt 2 Seiten (8k in 32-Bit-Linux) und enthält einen task_struct (ca. 1k) und den eigentlichen Stack (ca. 7k). Letzteres wird verwendet, um einige Auto-Variablen oder Funktionsaufrufparameter oder Funktionsadressen in Kernel-Funktionen zu speichern. Hier ist der Code (Processor.h (linux\include\asm-i386)):

#define THREAD_SIZE (2*PAGE_SIZE)
#define alloc_task_struct() ((struct task_struct *) __get_free_pages(GFP_KERNEL,1))
#define free_task_struct(p) free_pages((unsigned long) (p), 1)

__get_free_pages (GFP_KERNEL, 1)) bedeutet Speicherzuordnung als 2 ^ 1 = 2 Seiten.

Aber der Prozessstack ist eine andere Sache, seine Adresse ist nur unter 0xC0000000 (32-Bit-Linux), die Größe kann etwas größer sein und wird für die Aufrufe der User-Space-Funktionen verwendet.

Hier ist also eine Frage zum Systemaufruf, der im Kernel-Space läuft, aber vom Prozess im User-Space aufgerufen wurde. Wie funktioniert das? Wird Linux seine Parameter und Funktionsadressen im Kernel-Stack oder im Prozess-Stack ablegen? Lösung von Linux: Alle Systemaufrufe werden durch Softwareunterbrechung ausgelöst INT 0x80 . Definiert in entry.S (linux\Arch\i386\kernel), hier einige Zeilen zum Beispiel:

ENTRY(sys_call_table)
.long SYMBOL_NAME(sys_ni_syscall)   /* 0  -  old "setup()" system call*/
.long SYMBOL_NAME(sys_exit)
.long SYMBOL_NAME(sys_fork)
.long SYMBOL_NAME(sys_read)
.long SYMBOL_NAME(sys_write)
.long SYMBOL_NAME(sys_open)     /* 5 */
.long SYMBOL_NAME(sys_close)
2
user991800

IN Short Kernel Space ist der Teil des Speichers, in dem der Linux-Kernel ausgeführt wird (oberer virtueller 1-GB-Speicherplatz im Falle von Linux) und der User-Space ist der Teil des Arbeitsspeichers, in dem die Benutzeranwendung ausgeführt wird (untere 3 GB des virtuellen Speichers im Falle von Linux Ich möchte mehr über den Link erfahren :)

http://learnlinuxconcepts.blogspot.in/2014/02/kernel-space-and-user-space.html

2
JIN007

Der Versuch, eine sehr vereinfachte Erklärung zu geben

Der virtuelle Speicher ist in Kernel-Speicherplatz und den Benutzer-Speicherbereich unterteilt. Kernel-Speicherbereich ist der Bereich des virtuellen Speichers, in dem Kernel-Prozesse ausgeführt werden, und der Benutzer-Speicherplatz ist der Bereich des virtuellen Speichers, in dem Benutzer-Prozesse ausgeführt werden.

Diese Aufteilung ist für den Speicherzugriffsschutz erforderlich.

Immer wenn ein Bootloader einen Kernel nach dem Laden an einen Speicherort im RAM (normalerweise auf einem ARM - basierten Controller) startet, muss er sicherstellen, dass sich der Controller im Supervisor-Modus befindet und FIQs und IRQs deaktiviert sind.

1
Nanobrains

Der Speicher wird in zwei Bereiche unterteilt:

  • Der Benutzerbereich. Hierbei handelt es sich um eine Reihe von Speicherorten, an denen normale Benutzerprozesse ausgeführt werden (d. H. Alles andere als der Kernel). Die Rolle des Kernels besteht darin, Anwendungen, die in diesem Bereich ausgeführt werden, vor dem Durcheinander mit dem Computer zu schützen.
  • Der Kernel-Space, der der Ort ist, unter dem der Code des Kernels gespeichert und ausgeführt wird.

Prozesse, die unter dem Benutzerbereich ausgeführt werden, haben nur Zugriff auf einen begrenzten Teil des Speichers, während der Kernel auf den gesamten Speicher zugreifen kann. 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 absetzt und fortfährt seine Arbeit, nachdem der Handler fertig ist.

0
gopika

Kernel Space und User Space sind logische Räume.

Die meisten modernen Prozessoren sind so ausgelegt, dass sie in einem anderen privilegierten Modus laufen. x86-Maschinen können in 4 verschiedenen privilegierten Modi ausgeführt werden  enter image description here

Und ein bestimmter Maschinenbefehl kann ausgeführt werden, wenn er sich in einem bestimmten privilegierten Modus befindet.

Aufgrund dieses Entwurfs gewähren Sie einem Systemschutz oder Sandboxing die Ausführungsumgebung.

Kernel ist ein Stück Code, der Ihre Hardware verwaltet und Systemabstraktionen bietet. Daher muss es Zugriff auf alle Maschinenanweisungen haben. Und es ist die vertrauenswürdigste Software. Also sollte ich mit dem höchsten Privileg ausgeführt werden. Und Ringebene 0 ist der privilegierteste Modus. Daher wird Ringebene 0 auch als Kernel Mode bezeichnet.

Benutzeranwendungen sind Software, die von Drittanbietern stammen, und Sie können ihnen nicht vollständig vertrauen. Jemand mit böswilliger Absicht kann einen Code zum Absturz Ihres Systems schreiben, wenn er vollständigen Zugriff auf alle Maschinenanweisungen hatte. Die Anwendung sollte daher Zugang zu einer begrenzten Anzahl von Anweisungen erhalten. Und Ringebene 3 ist der Modus mit den geringsten Privilegien. Alle Anwendungen laufen also in diesem Modus. Daher wird Ringebene 3 auch User Mode genannt.

Hinweis: Ich bekomme keine Ring Levels 1 und 2. Sie sind im Grunde Modi mit Zwischenprivilegien. Es kann also sein, dass Gerätetreibercode mit diesem Privileg ausgeführt wird. AFAIK, Linux verwendet nur Ring Level 0 und 3 zur Kernel-Code-Ausführung und Benutzeranwendung.

Jede Operation, die sich im Kernel-Modus befindet, kann daher als Kernel-Space angesehen werden . Jede im User-Modus stattfindende Operation kann als User-Space betrachtet werden.

0
Darshan L

Die richtige Antwort lautet: Kernel Space und User Space gibt es nicht. Der Prozessoranweisungssatz verfügt über spezielle Berechtigungen, um destruktive Elemente wie den Stamm der Seitentabelle festzulegen oder auf den Speicher der Hardwaregeräte usw. zuzugreifen.

Kernel-Code hat die höchsten Berechtigungen und Benutzercode die niedrigsten. Dadurch wird verhindert, dass Benutzercode das System zum Absturz bringt, andere Programme modifiziert usw.

Im Allgemeinen wird der Kernel-Code unter einer anderen Speicherzuordnung als der Benutzercode gehalten (genau wie Benutzerspeicherbereiche in anderen Speicherzuordnungen als einander). Von hier stammen die Begriffe "Kernel Space" und "User Space". Dies ist jedoch keine feste Regel. Da der x86 beispielsweise indirekt erfordert, dass seine Interrupt-/Trap-Handler immer zugeordnet werden, muss ein Teil (oder einige Betriebssysteme) des Kernels dem Benutzerraum zugeordnet werden. Dies bedeutet wiederum nicht, dass dieser Code Benutzerrechte hat.

Warum ist die Kernel/User-Division notwendig? Einige Designer sind sich nicht einig, dass dies tatsächlich notwendig ist. Die Microkernel-Architektur basiert auf der Idee, dass die Abschnitte mit den höchsten Privilegien so klein wie möglich sein sollten, wobei alle wichtigen Vorgänge in für Benutzer privilegiertem Code ausgeführt werden sollten. Sie müssten studieren, warum dies eine gute Idee ist, es ist kein einfaches Konzept (und ist dafür bekannt, sowohl Vor- als auch Nachteile zu haben).

0
Scott Franco