GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum wird der Kernel demselben Adressraum wie Prozesse zugeordnet?

Um einen anderen Teil der Frage zu beantworten:Der Kernel wird teilweise aus Effizienz- / Leistungsgründen in den Adressraum jedes Prozesses abgebildet (es gibt auch andere, da bin ich mir sicher).

Auf der meisten modernen Hardware ist es schneller, die Sicherheitsstufe zu ändern (wodurch der Zugriff auf die ansonsten geschützten Seiten ermöglicht wird, wie in Alexeys Antwort erwähnt), um Systemaufrufe und andere vom Kernel bereitgestellte Funktionen auszuführen, als die Sicherheitsstufe zu ändern und die gesamte virtuelle Speicherabbildung zusammen mit allen zugeordneten TLB-Cache-Flushes und allem anderen, was an einem vollständigen Kontextwechsel beteiligt ist.

Da Systemaufrufe ziemlich häufige Ereignisse sein können, ist das Design, das sich in Linux und vielen anderen Orten entwickelt hat, um zu versuchen, den Overhead der Nutzung von Kerneldiensten zu minimieren, und das Mapping des Kernelcodes und (zumindest einiger der) Daten in jeden Prozess, ein Teil davon davon.


Ein Prozess "besitzt" hier den gesamten virtuellen Adressraum, den Kernel und die Benutzeranteile davon.

Seine Unfähigkeit, den Kernelcode und die Kerneldaten einzusehen und zu stoßen, liegt nicht an unterschiedlichen Adressräumen, sondern an unterschiedlichen Zugriffsrechten/Berechtigungen, die in den Seitentabellen festgelegt sind. Kernel-Seiten sind so eingerichtet, dass normale Anwendungen nicht darauf zugreifen können.

Es ist jedoch üblich, die beiden Teile eines Ganzen als Kernel-Space und User-Space zu bezeichnen, und das kann verwirrend sein.


Stellen Sie sich vor, was passieren würde, wenn der Kernel nicht in jedem Prozessadressraum abgebildet wird. Es würde einen dreifachen Fehler verursachen, weil beispielsweise der Timer-Interrupt auftritt, dann ruft der Prozessor die ISR-Routine mit IDT (Interrupt Descriptor Table) auf. Wenn der Kernel nicht abgebildet ist, dann die IDT-Adresse ungültig wird und somit ein dreifacher Fehler entsteht.


Ein weiterer wichtiger Grund, warum wir sagen, dass sich der Kernel im Adressraum des Prozesses befindet, ist, dass der Kernel auf den Benutzercode/die Daten des AKTUELLEN Prozesses zugreifen kann, d. h. auf den virtuellen Adressraum 0~3G.

Entschuldigung für mein schlechtes Englisch. Ich bin kein englischer Muttersprachler.


Linux
  1. Warum ist die PGID der untergeordneten Prozesse nicht die PGID des übergeordneten Prozesses?

  2. Wenn Prozesse die Umgebung des übergeordneten Elements erben, warum brauchen wir dann den Export?

  3. Linux – Warum ist kein Rootfs-Dateisystem auf dem System vorhanden?

  4. Linux – Warum kann der Kernel Init nicht ausführen?

  5. Ausführen einer User-Space-Funktion aus dem Kernel-Space

Verstehen der Unterstützung für virtuelle 52-Bit-Adressen im Arm64-Kernel

Warum haben mehrere Instanzen von Mate-Terminal dieselbe Pid?

Warum würde der Kernel Pakete fallen lassen?

Linux – Warum gibt es eine Linux-Kernel-Richtlinie, um den Benutzerbereich niemals zu unterbrechen?

Warum aktualisiert Apt den Kernel nicht mehr?

Warum den Linux-Kernel vor dem Root-Benutzer schützen?