Was sind unter Linux hoher und niedriger Arbeitsspeicher?


92

Ich interessiere mich für den Unterschied zwischen Highmem und Lowmem:

  1. Warum gibt es eine solche Differenzierung?
  2. Was gewinnen wir dadurch?
  3. Welche Funktionen hat jeder?

@hiro, du meinst "HIGHMEM" ist "Kernel Virtual Address" wie von ldd3 beschrieben. Ich stimme mit Ihnen ein. es ist verwirrend, ldd3 definiert "LOWMEM" "HIGHMEM", definiert auch "Kernel virtuelle Adresse" "Kernel logische Adresse". Sie sind dasselbe, haben aber einen anderen Namen. Das ist die "Schönheit" von Software, sie ist also beschreibungssprachenabhängig.
Steve

Antworten:


69

In einer 32-Bit-Architektur beträgt der Adressraumbereich für die Adressierung des RAM:

0x00000000 - 0xffffffff

oder 4'294'967'295(4 GB).

Der Linux-Kernel teilt das 3/1 (könnte auch 2/2 oder 1/3 1 sein ) in User-Space (hoher Speicher) und Kernel-Space (niedriger Speicher) auf.

Der Benutzerbereich:

0x00000000 - 0xbfffffff

Jeder neu erzeugte Benutzerprozess erhält eine Adresse (einen Bereich) in diesem Bereich. Benutzerprozesse sind im Allgemeinen nicht vertrauenswürdig und dürfen daher nicht auf den Kernel-Space zugreifen. Außerdem wird davon ausgegangen, dass sie nicht dringend sind. In der Regel versucht der Kernel, die Zuordnung des Speichers zu diesen Prozessen aufzuschieben.

Der Kernel-Space-Bereich:

0xc0000000 - 0xffffffff

Ein Kernelprozess erhält hier seine Adresse (Range). Der Kernel kann direkt auf diese 1 GB Adressen zugreifen (naja, nicht auf die gesamten 1 GB, es sind 128 MB für den Hochspeicherzugriff reserviert).

Im Kernelraum erzeugte Prozesse sind vertrauenswürdig, dringend und werden als fehlerfrei angesehen. Die Speicheranforderung wird sofort verarbeitet.

Jeder Kernel-Prozess kann auf Wunsch auch auf den User-Space-Bereich zugreifen. Und um dies zu erreichen, ordnet der Kernel eine Adresse aus dem User Space (dem High Memory) seinem Kernel Space (dem Low Memory) zu, die oben genannten 128 MB sind speziell dafür reserviert.


1 Ob der Split 3/1, 2/2 oder 1/3 ist, wird durch die CONFIG_VMSPLIT_...Option gesteuert . Sie können wahrscheinlich unter überprüfen /boot/config*, welche Option für Ihren Kernel ausgewählt wurde.


Das ist alt und ich bin mir nicht sicher, ob du hier bist. Aber ich möchte eines fragen: Die reservierten 128 MB im Kernel-Speicher (für hohen Speicherzugriff), sind das alle Referenzen des User-Space-Speicherbereichs? Ein Kernel-Prozess kann also auf jeden Benutzerbereich zugreifen, indem er sich auf diesen Bereich bezieht, oder?
Amumu

1
Warum ist es immer in 1/4? Dh warum konnte es nicht 5/1 oder so geteilt werden?
mgalgs

Was bedeutet hier genau "direkt zugreifen können"? Ich meine, wird nicht über den Mechanismus des virtuellen Speichers auf den Kernel selbst zugegriffen?
Telenn

1
Ich glaube, dass das, was Sie über hohen / niedrigen Speicher sagen, falsch ist: Ich glaube, dass in einem reinen 32-Bit-System der Kernel direkt auf die gesamten 3 GB des Benutzerraums zugreifen kann (der Kernel kann auf den Kernelraum und den Benutzerraum zugreifen). Wenn Sie jedoch einen PAE-Kernel haben, werden die Dinge komplexer. Jetzt haben Sie mehr als 3 GB RAM, jeder Prozess kann 3 GB groß sein und Sie können nicht direkt auf den gesamten Benutzerraum zugreifen. Hier kommt High Mem und die 128 MB Speicher im Kernel-Speicher ins Spiel. Mit einem 64-Bit-Kernel wird es wieder einfacher, keine High Men, da der gesamte Benutzer-Speicher vom Kernel aus zugänglich ist.
Strg-Alt-Delor

2
@mgalgs ¼, 2/4 und ¾ waren nur eine Reihe von Standardoptionen, die angezeigt wurden. Seit 2007 kann man auch 5/16 und 15/32 wählen. Wenn Sie wissen, welche #define-Zeile bearbeitet werden soll, können Sie eine beliebige Aufteilung auswählen.
Jørgensen

28

Die erste Referenz, auf die wir uns beziehen, sind Linux-Gerätetreiber (sowohl online als auch in Buchform verfügbar), insbesondere Kapitel 15, das einen Abschnitt zum Thema enthält.

In einer idealen Welt kann jede Systemkomponente den gesamten Speicher abbilden, auf den sie jemals zugreifen muss. Dies gilt auch für Prozesse unter Linux und den meisten Betriebssystemen: Ein 32-Bit-Prozess kann nur auf etwas weniger als 2 ^ 32 Byte virtuellen Speicher zugreifen (in der Tat etwa 3 GB bei einer typischen 32-Bit-Linux-Architektur). Es wird schwierig für den Kernel, der in der Lage sein muss, den gesamten Arbeitsspeicher des Prozesses abzubilden, dessen Systemaufruf ausgeführt wird, sowie den gesamten physischen Arbeitsspeicher und jedes andere speicherabgebildete Hardwaregerät.

Wenn ein 32-Bit-Kernel mehr als 4 GB Speicher zuordnen muss, muss er mit hoher Speicherunterstützung kompiliert werden. High Memory ist ein Speicher, der nicht permanent im Adressraum des Kernels abgebildet ist. (Wenig Speicher ist das Gegenteil: Es wird immer zugeordnet, sodass Sie im Kernel darauf zugreifen können, indem Sie einfach einen Zeiger dereferenzieren.)

Wenn Sie vom Kernel-Code aus auf hohen Speicher zugreifen, müssen Sie kmapzuerst aufrufen , um einen Zeiger von einer Seitendatenstruktur ( struct page) zu erhalten. Der Aufruf kmapfunktioniert , ob die Seite ist in hohen oder niedrigen Speicher. Es gibt auch kmap_atomicEinschränkungen, die für Multiprozessor-Computer jedoch effizienter sind, da feinere Sperren verwendet werden. Der Zeiger, der über abgerufen wird, kmapist eine Ressource: Er belegt den Adressraum. Sobald Sie damit fertig sind, müssen Sie anrufen kunmap(oder kunmap_atomic), um diese Ressource freizugeben. Dann ist der Zeiger nicht mehr gültig und auf den Inhalt der Seite kann erst zugegriffen werden, wenn Sie kmaperneut anrufen .


2
Vielen Dank an Gilles für die Antwort. Aber ich kann immer noch nicht das ganze Konzept verstehen. Könnten Sie bitte ein bisschen einfacher sein, ohne die darin enthaltenen Informationen zu reduzieren?
Sen

17

Dies ist für den Linux-Kernel relevant. Ich bin mir nicht sicher, wie ein Unix-Kernel damit umgeht.

Der hohe Speicher ist das Speichersegment, das User-Space-Programme adressieren können. Es kann nicht Low Memory berühren.

Low Memory ist das Speichersegment, das der Linux-Kernel direkt ansprechen kann. Wenn der Kernel auf High Memory zugreifen muss, muss er es zuerst in seinen eigenen Adressraum abbilden.

Kürzlich wurde ein Patch eingeführt, mit dem Sie steuern können, wo sich das Segment befindet. Der Nachteil ist, dass Sie dem Benutzerbereich adressierbaren Speicherplatz entziehen können, damit der Kernel über mehr Speicher verfügt, den er vor der Verwendung nicht zuordnen muss.

Zusätzliche Ressourcen:


4

HIGHMEM ist ein Bereich des Speicherbereichs des Kernels, aber es ist NICHT der Speicher, auf den Sie zugreifen, sondern ein Ort, an dem Sie das ablegen, worauf Sie zugreifen möchten.

Eine typische virtuelle 32-Bit-Linux-Speicherzuordnung sieht folgendermaßen aus:

  • 0x00000000-0xbfffffff: Benutzerprozess (3 GB)

  • 0xc0000000-0xffffffff: Kernelspeicher (1 GB)

(CPU-spezifischer Vektor und was auch immer werden hier ignoriert).

Linux teilt den Kernel-Speicherplatz von 1 GB in zwei Teile, LOWMEM und HIGHMEM. Die Aufteilung variiert von Installation zu Installation.

Wenn eine Installation beispielsweise 512 MB bis 512 MB für LOW- und HIGH-Mems auswählt, wird das 512 MB-LOWMEM (0xc0000000-0xdfffffff) zum Zeitpunkt des Systemstarts statisch zugeordnet. In der Regel werden hierfür die ersten so vielen Bytes des physischen Speichers verwendet, dass virtuelle und physische Adressen in diesem Bereich einen konstanten Versatz von beispielsweise 0xc0000000 aufweisen.

Auf der anderen Seite hat die letzte 512 MB (HIGHMEM) keine statische Zuordnung (obwohl Sie Seiten dort semipermanent zugeordnet lassen könnten, müssen Sie dies jedoch explizit in Ihrem Treibercode tun). Stattdessen werden Seiten hier vorübergehend zugeordnet und nicht zugeordnet, sodass virtuelle und physische Adressen in diesem Bereich keine konsistente Zuordnung haben. Typische Verwendungen von HIGHMEM umfassen einmalige Datenpuffer.


3

Soweit ich mich erinnere, wird "High Memory" für den Anwendungsspeicher und "Low Memory" für den Kernel verwendet.

Vorteil ist, dass (User-Space-) Anwendungen nicht auf den Kernel-Space-Speicher zugreifen können.


0

Viele Leute haben gesagt, dass der niedrige Speicher für das Betriebssystem ist. Dies ist normalerweise der Fall, muss es aber nicht sein. Hoher Arbeitsspeicher und niedriger Arbeitsspeicher sind nur zwei Teile des Arbeitsspeichers, aber in Linux-Systemen ist niedriger Arbeitsspeicher nur für den Kernel und hoher Arbeitsspeicher für Benutzerprozesse.

Gemäß dem "Dinosaurierbuch (Betriebssystemkonzepte)" können wir das Betriebssystem entweder in einen niedrigen oder in einen hohen Arbeitsspeicher stellen. Der Hauptfaktor, der diese Entscheidung beeinflusst, ist der Ort des Unterbrechungsvektors. Da sich der Interrupt-Vektor häufig in einem niedrigen Arbeitsspeicher befindet, platzieren Programmierer das Betriebssystem normalerweise auch in einem niedrigen Arbeitsspeicher.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.