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

Was sind High Memory und Low Memory unter Linux?

Auf einer 32-Bit-Architektur ist der Adressraumbereich zum Adressieren von 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 sein) in Userspace (hoher Arbeitsspeicher) bzw. Kernelspace (niedriger Arbeitsspeicher) auf.

Der Benutzerbereich:

0x00000000 - 0xbfffffff

Jeder neu gestartete Benutzerprozess erhält eine Adresse (Bereich) innerhalb dieses Bereichs. Benutzerprozesse sind im Allgemeinen nicht vertrauenswürdig und dürfen daher nicht auf den Kernelspace zugreifen. Außerdem werden sie als nicht dringend angesehen, in der Regel versucht der Kernel, die Zuweisung von Speicher an diese Prozesse hinauszuzögern.

Der Bereich des Kernels:

0xc0000000 - 0xffffffff

Ein Kernel-Prozess erhält hier seine Adresse (Bereich). Der Kernel kann direkt auf diese 1 GB an Adressen zugreifen (na ja, nicht die vollen 1 GB, es sind 128 MB für hohen Speicherzugriff reserviert).

Im Kernelspace erzeugte Prozesse sind vertrauenswürdig, dringend und werden als fehlerfrei angenommen, die Speicheranforderung wird sofort verarbeitet.

Jeder Kernel-Prozess kann auch auf den User-Space-Bereich zugreifen, wenn er möchte. Und um dies zu erreichen, bildet der Kernel eine Adresse aus dem User Space (dem High Memory) auf seinen Kernel Space (den Low Memory) ab, die oben erwähnten 128 MB sind speziell dafür reserviert.

Ob die Teilung 3/1, 2/2 oder 1/3 ist, wird durch CONFIG_VMSPLIT_... gesteuert Möglichkeit; Sie können wahrscheinlich unter /boot/config* nachsehen um zu sehen, welche Option für Ihren Kernel ausgewählt wurde.


Die erste Referenz, der Sie sich zuwenden sollten, ist Linux Device Drivers (sowohl online als auch in Buchform verfügbar), insbesondere Kapitel 15, das einen Abschnitt zu diesem Thema enthält.

In einer idealen Welt wäre jede Systemkomponente in der Lage, den gesamten Speicher abzubilden, auf den sie jemals zugreifen muss. Und dies ist bei Prozessen unter Linux und den meisten Betriebssystemen der Fall:Ein 32-Bit-Prozess kann nur auf etwas weniger als 2^32 Byte virtuellen Speicher zugreifen (tatsächlich etwa 3 GB auf einer typischen Linux-32-Bit-Architektur). Schwierig wird es für den Kernel, der in der Lage sein muss, den gesamten Speicher des Prozesses abzubilden, dessen Systemaufruf er ausführt, plus den gesamten physischen Speicher, plus jedes andere speicherabgebildete Hardwaregerät.

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

Wenn Sie vom Kernelcode auf hohen Speicher zugreifen, müssen Sie kmap aufrufen zuerst, um einen Zeiger aus einer Seitendatenstruktur zu erhalten (struct page ). Anruf kmap funktioniert unabhängig davon, ob sich die Seite im hohen oder niedrigen Speicher befindet. Es gibt auch kmap_atomic Dies hat zusätzliche Einschränkungen, ist jedoch auf Multiprozessormaschinen effizienter, da es eine feinkörnigere Sperrung verwendet. Der durch kmap erhaltene Zeiger ist eine Ressource:Sie verbraucht Adressraum. Sobald Sie damit fertig sind, müssen Sie kunmap anrufen (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 kmap aufrufen wieder.


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

Der High Memory ist das Speichersegment, das User-Space-Programme adressieren können. Low Memory kann nicht berührt werden.

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 Kompromiss besteht darin, dass Sie den adressierbaren Speicher aus dem Benutzerbereich entfernen können, sodass der Kernel mehr Speicher haben kann, den er vor der Verwendung nicht zuordnen muss.

Zusätzliche Ressourcen:

  • http://tldp.org/HOWTO/KernelAnalysis-HOWTO-7.html
  • http://linux-mm.org/HighMemory

Linux
  1. Linux – Was bedeutet das virtuelle Kernel-Speicherlayout in Dmesg?

  2. Linux – Sind verschiedene Linux/Unix-Kernel austauschbar?

  3. In welchen Sprachen sind Windows, Mac OS X und Linux geschrieben?

  4. Welche Zeichen sind in Windows- und Linux-Verzeichnisnamen verboten?

  5. Linux-Kernel-Live-Debugging, wie wird es gemacht und welche Tools werden verwendet?

Linux Kernel 5.9:Was ist neu und wie man aktualisiert

Was sind Snaps und wie wird es auf verschiedenen Linux-Distributionen installiert?

Was sind Linux-Protokolle und wo sind sie zu finden?

Linux-Kernel und seine Funktionen

Was tun bei einer Linux-Kernel-Panik?

Linux-Speichersegmentierung