Unter Linux auf x86-Systemen HIGHMEM vermeiden
Ich will nicht behaupten, dass ich das Problem bis ins letzte verstehe, aber Fakt ist: auf x86-Systemen ab 896 MB RAM hat man unter Linux ein Problem: HIGHMEM. Worum geht es?
Da es in der x86-Architektur nur 4 GB Adressraum gibt, muss man den irgendwie aufteilen. Linux benutzt dafür normalerweise eine Aufteilung namens 3G/1G: Jeder Prozess im Userspace kann 3 GB Speicher logisch ansprechen, der Kernel 1 GB. Der Kernel muss aber irgendwie auf den gesamten physikalischen Speicher zugreifen können: um das zu erreichen, wird von dem Speicher, der über 1 GB hinausgeht – HIGHMEM genannt –, immer nur ein Teil in den Kernel-Adressraum eingeblendet. Wer noch mit DOS gearbeitet hat, wird sich an EMS erinnern, das funktionierte im Prinzip genauso.
Bei 2.4er-Kerneln wurde bei 1 GB Speicher noch geraten, aus Geschwindigkeitsgründen lieber HIGHMEM komplett abzuschalten und nur 896 MB zu nutzen, als mit 128 MB HIGHMEM zu leben. Bei 2.6er-Kerneln soll das nicht mehr so schlimm sein, aber genaue Zahlen konnte ich nirgendwo finden. Hier muss jeder abwägen, ob er mit den Problemen (dazu später) leben kann.
Lösung
Seit Kernelversion 2.6.16 gibt es die Möglichkeit, diese Aufteilung zu ändern. Als Gentoo-Nutzer ist der Kernel eh selbstkompiliert, also kein Problem, auch wenn die Option gut versteckt ist. Man muss zunächst folgendes aktiviert haben:
General setup --->
[*] Prompt for development and/or incomplete code/drivers
…
[*] Configure standard kernel features (for small systems) --->
…
Dann kann man auch das hier einstellen:
Processor type and features --->
…
Memory split (…) --->
…
In diesem Unterpunkt hat man dann die Wahl zwischen den verschiedenen Aufteilungen (diese gibt es in 2.6.23):
- 3G/1G (896 MB ohne HIGHMEM),
echtem
3G/1G (damit ist wirklich 1 GB ohne HIGHMEM möglich),- 2G/2G (2 GB − 128 MB),
- „echte“ 2G/2G (2 GB) sowie
- 1G/3G-Aufteilung (3 GB − 128 MB ohne HIGHMEM).
Probleme
Ganz problemlos ist das ganze leider nicht. Hier eine Auflistung einiger Probleme, die ich gefunden habe:
- Die Größe von Prozessen ist, unabhängig von vorhandenem RAM oder Swap, auf den ersten Wert begrenzt. Bis zu den
echten
2G/2G würde ich das mitmachen, aber 1G/3G könnte problematisch sein. Wer über 2 GB RAM hat, will wahrscheinlich auch Programme laufen lassen, die mehr als 1 GB belegen. - Binärmodule, die für 3G/1G kompiliert wurden, funktionieren möglicherweise nicht. Der aktuelle proprietäre NVIDIA-Treiber ist allerdings davon nicht betroffen; wie das bei anderen Dingen aussieht, weiß ich nicht.
- Wine funktioniert nicht richtig. Ich hab es nicht genau recherchiert, da ich Wine eigentlich nicht brauche, aber soweit ich es verstehe, benutzt Windows normalerweise 3G/1G, und das simuliert Wine auch; ab Windows 2000 als Kompatibilitätseinstellung geht aber auch 2G/2G. Wenn man also nichts mit Wine laufen lässt, das nur unter simuliertem Windows 9x läuft, sollte es trotzdem gehen.
Links
- HighMemory (LinuxMM-Wiki) mit einigen allgemeinen und technischen Informationen (englisch)
Feature: High Memory In The Linux Kernel
(KernelTrap, Februar 2004) geht etwas tiefer (englisch)Linux: Using 1GB of RAM Without HighMem
(KernelTrap, Januar 2006) beschreibt die Entstehung der Kerneloption (englisch)