Hallo,
kann mir jemand erklären, ob und wie es möglich ist, auf gängigen 32 Bit
Windows-Betriebs-Systemen volle 4 GB RAM zu nutzen?
Ich finde dazu widersprüchliche Angaben im Netz, einige sagen es geht,
andere sagen es geht nicht, dann wiederum soll es gehen, wenn man VRAM
abzieht(ist damit jetzt einen TurboCache-GraKa gemeint, oder betrifft
das auch GraKas mit dediziertem Speicher?).
Anwendungen sollen angeblich nur 2 GB vertragen...dann wird von
MemoryMapping, PAE und ähnlichem geredet, das einem schwindelig wird.
Kann hier jemand mal einfach und verständlich erklären, wie das mit den
4GB und den 32 Bit unter WinXP Home, WinVista und Win7 funktioniert?
Vielen Dank,
Jerry
Mit 32 Bit kannst du 4 GB adressieren.
Diese 4 GB sind jetzt allerdings nicht zum beliebigen Verpulvern,
sondern je nach Betriebssystem, HW etc. gehen noch ein paar Bereiche ab.
Das ist Code von Bibliotheken, Code des eigenene Programms,
Code des OS, eingeblendeter Grafikspeicher, IO-Adressen usw..
Wenn ein OS jetzt einfach mal dreist 2 GB für so etwas
reserviert (auch wenn es nur Fragmente davon wirklich nutzt),
kommst du für den restlichen Prozess halt nur noch auf
die verbliebenen 2 GB.
Etwas schlauer ist es, wenn sich das OS mit 1 GB begnügt, dann
bleiben dir 3.
Volle 4 GB wirst du aber nie haben.
Jerry schrieb:> Kann hier jemand mal einfach und verständlich erklären, wie das mit den> 4GB und den 32 Bit unter WinXP Home, WinVista und Win7 funktioniert?
Gar nicht. Mit 32bit kann mann max. 4GB adressieren. Da aber sämtliche
Hardware noch einen Anteil an dem Adressbereich haben will, allen voran
die Grafikkarte, sind es nur ca. 3.75 GB oder so. Es soll zwar Lösungen
geben, die auf die vollen 4GB zugreifen, bloss funktinieren habe ich
sowas noch nicht sehen.
Die 32-Bit-Versionen von Windows mit Ausnahme des "Advanced Server", den
es zu Windows 2000-Zeiten gab, sind allesamt nicht in der Lage, PAE zu
nutzen. Das ist eine Technik, mit der ein 32-Bit-Betriebssystem mehr als
4 GiB Adressraum nutzen kann (sofern es die verwendete Hardware
unterstützt, aber das tut sie schon ziemlich lange).
Wenn kein PAE verwendet wird, ist der Adressraum auf 4 GiB beschränkt -
und die PC-Hardware-Architektur üblicher Motherboards zwickt von diesem
Adressraum zwischen 0.5 und 1 GiB ab für PCI-/PCIe-Devices.
Andere Betriebssyteme wie Linux oder auch Mac OS X nutzen PAE und können
so problemlos mit erheblich mehr als 4 GiB Speicher umgehen, ohne einen
64-Bit-Kernel zu erzwingen, der wieder mit neuen Devicetreibern etc.
einherginge. Zumindest unter OS X wird das Spiel so weit getrieben, daß
trotz des 32-Bit-Kernels auch 64-Bit-Prozesse möglich sind (wenn auch
mit aufgrund der komplexeren Speicherverwaltung geringfügig reduzierter
Performance).
Jerry schrieb:> auf gängigen 32 Bit>> Windows-Betriebs-Systemen volle 4 GB RAM zu nutzen
Ja mit den Servervarianten sind bei 32Bit bis zu 64GB RAM Möglich.
Quelle:
http://www.microsoft.com/germany/windowsserver2003/editionen/default.mspx
Bei den nicht Server Varianten (XP, ...) hast du bei 32Bit nur eine
Chance den vollen RAM zu benutzen, du richtest dir ein Gavotte Ramdrive
ein, dies kann den vollen RAM ansprechen. Du kannst dann die Win
Auslagerungsdatei dortin legen.
Der Speicher ist dann allerdings von Anwendungen heraus nicht direkt
ansprechbar sondern verwaltet über Windows per Swapfile.
eine der Anleitungen:
http://dlh-clan.eu/board/viewtopic.php?f=19&t=23
viele Grüße
Mario
Jerry schrieb:> Anwendungen sollen angeblich nur 2 GB vertragen...
Das ist richtig.
Man muß hier unterscheiden zwischen dem realen Speicher, den das
Betriebssystem ansprechen kann und dem virtuellen Adressraum, den ein
Programm zur Verfügung hat.
Bei Systemen, die PAE nicht können, ist der vom Betriebssystem
addressierbare Bereich wie schon gesagt wurde auf 4 GB beschränkt.
Dann gibt es da aber noch den virtuellen Adressraum, den jeder Prozess
hat. Dieser ist bei den gängigen 32-Bit-Systemen auf 4 GB beschränkt
(auch wenn technisch mehr ginge). Und hier wird dann auch ein Teil des
Adressraums für Memory-Mapping reserviert. Bei Windows sind das 2 GB,
und so bleiben für das Programm selbst auch nur noch 2 GB übrig.
Warum sollte Microsoft ein Interesse daran haben, die Hardware voll
auszureizen? Das übernimmt dann die nachfolgende Version. (Bei Vista
konnte man es gut sehen.)
Microsoft beschränkt für 32 Bit Prozesse den virtuellen Adressraum auf 2
GB. Dieses Verhalten kann mit setzen eines Flags im PE Header
ausgeschaltet werden, so dass man auch als 32 Bit Prozess einen vollen
virtuellen Adressraum von 4 GB bekommt. (0x20 in den PE Flags).
Warum 2 GB? Weil die meiste Pointer Arithmetik die so in den Programmen
und Sprachen betrieben wird, nicht immer sicher mit den Typen umgeht.
Sprich: es gibt genug Code der dummerweise einfach mal auf einen int
castet um damit irgendwelche Adressen auszurechnen. Dadurch werden die
Zahlen bei Adressen über dem 2 GB Raum negativ und die
Pointer/Adressarithmetik im Programm geht in eine Richtung, die so nicht
beabsichtigt war. Von daher diese Einschränkung auf 2^31 (ohne MSB,
sprich Vorzeichen) anstatt 2^32.
Aber wie gesagt: mit Flag im PE Header kann man sich dem OS gegenüber
ausweisen, dass man um diesen Fakt weiss und seine Adressberechnungen
alle samt unsigned sind.
Naja, Windows ist da ja auch nicht gerade ein Vorbild drin. Allein in
den Argumenten der Fenstercallbacks ('WndProc') wird ja alles, was sich
nicht wehrt, auf long gecastet :->
Das irrwitzige ist ja, dass Windows XP PAE aktiviert, es aber nur für
das NX-Bit nutzt. -> Mehr als 4Gig Ram nur für 64Bit. Was soll das? Ich
schätze mal das hat mehr strategische als technische Gründe.
Tja.
Du siehst ja, wenn du dir eine der Serverversionen zulegst, so traut man
dir automatisch zu, beurteilen zu können, ob die Adreßarithmetik
stimmt...
Sven P. schrieb:> Du siehst ja, wenn du dir eine der Serverversionen zulegst, so traut man> dir automatisch zu, beurteilen zu können, ob die Adreßarithmetik> stimmt...
Äpfel != Birnen
Auf den Server Betriebssystemvarianten bekommen 32 Bit Anwendungen auch
nur einen virtuellen Adressraum von 2 GB zugesprochen. Mehr geht
grundsätzlich bei einem 32 Bit PE nur, wenn das entsprechende Flag
gesetzt ist.
Thomas K. schrieb:> ausgeschaltet werden, so dass man auch als 32 Bit Prozess einen vollen> virtuellen Adressraum von 4 GB bekommt. (0x20 in den PE Flags).
Sind das nicht eher 3GB? Die ausserdem erfordern, dass das Windows im
entsprechenden Modus gestartet wird (/3GB Switch in BOOT.INI)?
3.2 GB, da die 800 MB für das Memory Mapping des PCI Busses ausgespart
werden. Aber ja, der switch muss bei einem 32 Bit OS mit gesetzt sein,
bei einem 64 Bit OS geht dies natürlich ohne.
Thomas K. schrieb:> 3.2 GB, da die 800 MB für das Memory Mapping des PCI Busses ausgespart> werden.
Da verwechselst du nun physikalischen mit virtuellem Adressraum. Die
/3GB Sache läuft im virtuellen Adressraum und kann bereits bei mehr als
1GB physikalischen Speichers sinnvoll sein (O-Ton Microsoft, s.u.). Mit
Grösse und Adressierbarkeit des physikalischen Speichers hat das nichts
zu tun.
Zu /3GB und dem Adressraum:
http://www.microsoft.com/whdc/system/platform/server/pae/paemem.mspx
Zu /3GB und Exchange-Server:
http://support.microsoft.com/kb/823440/en-us
A. K. schrieb:> Da verwechselst du nun physikalischen mit virtuellem Adressraum. Die> /3GB Sache läuft im virtuellen Adressraum und kann bereits bei mehr als> 1GB physikalischen Speichers sinnvoll sein (O-Ton Microsoft, s.u.). Mit> Grösse und Adressierbarkeit des physikalischen Speichers hat das nichts> zu tun.
Der physikalische Speicher wird eingeschränkt um das MMIO zu
gewährleisten. Diese muss innerhalb des 32 Bit Adressraumes liegen (u.a.
wegen PCI Registern & DMA Controller, etc) - also innerhalb der 4 GB.
Dieser Speicherraum (der bis zu 800 MB betragen kann) ist "verloren" und
der dahinter liegende Hardwarespeicher kann auch durch Virtualisierung
der Adressräume nicht angesprochen werden. Von daher kommt diese
Beschränkung auf die maximalen 3,2 GB im virtuellen Adreßraum der 32 Bit
Prozesse.
Es basiert zwar auf Einschränkungen des physikalischen Adressraumes,
schlägt sich aber in Folge durch bis in den virtuellen Adressraum
(zumindest in einem 32 Bit Windows Host OS).
http://support.microsoft.com/kb/929605/en-ushttp://blogs.msdn.com/b/hiltonl/archive/2007/04/13/the-3gb-not-4gb-ram-problem.aspx
Thomas K. schrieb:> Der physikalische Speicher wird eingeschränkt um das MMIO zu> gewährleisten. Diese muss innerhalb des 32 Bit Adressraumes liegen (u.a.> wegen PCI Registern & DMA Controller, etc) - also innerhalb der 4 GB.
Yep. Hat aber mit der beschriebenen Thematik nichts zu tun.
> Dieser Speicherraum (der bis zu 800 MB betragen kann) ist "verloren" und> der dahinter liegende Hardwarespeicher kann auch durch Virtualisierung> der Adressräume nicht angesprochen werden.
Systeme mit mehr als 3GB RAM können ohne PAE nur 3GB RAM verwalten
(PSE36 mal aussen vor gelassen), weil der Rest entweder nicht sichtbar
und damit verloren ist, oder vom Memory Controller jenseits der 4GB
Grenze gemappt wird. In letzterem Fall kann es prinzipiell von einem PAE
Kernel gesehen und genutzt werden. Wobei nicht jeder PAE-Kernel dies
auch tut, aber das ist dann eher Politik als Technik.
> Von daher kommt diese> Beschränkung auf die maximalen 3,2 GB im virtuellen Adreßraum der 32 Bit> Prozesse.
Nein. Die Aufteilung des virtuellen Adressraum in 2GB/3GB (3,0GiB, nicht
3,2) Prozessadressraum und 2GB/1GB Kerneladressraum ist ausschliesslich
eine strategische Entscheidung der Betriebssystementwickler und hat
überhaupt nichts mit dem physikalischen Adressraum zu tun. Der virtuelle
Adressraum eines Prozesses ist in keinster Weise von den Eigenschaften
der physikalischen Adressierung betroffen.
Es wäre prinzipiell auch möglich, diese Adressräume zu trennen, so dass
dem Prozess volle 4GB Adressraum (nicht RAM!) zur Verfügung stehen, nur
wird dann der Umgang mit den Adressen umständlicher (so geschehen
naheliegenderweise in den ursprünglichen Unixen auf 16-Bit PDP-11). Dies
hat Microsoft jedoch in Windows nicht gemacht, sondern den
Kerneladressraum in jeden Prozess eingeblendet. Ist einfacher.
NB: In einem der verlinkten Artikel steht, dass der 3GB-Switch nur bis
16GB RAM funktioniert, weil darüber 1GB für den Kerneladressraum zu
klein sind.
Diese 2/2 oder 3/1 Adressaufteilung ist auch unabhängig davon, ob das
Windows mit den alten 32-Bit Descriptoren arbeitet, oder mit den neuen
64-Bit Descriptoren die unter dem Kürzel PAE laufen. Mit PAE lassen sich
technisch mehr als 4GB physikalischen Adressraums verwalten. Wieviel
MS davon dem Anwender zugesteht ist mittlerweile nur noch eine
Lizenzfrage.
Aktuelle Windows-Kernels (alle ab XP mit der "data execution
prevention") arbeiten durchweg mit PAE, auch dann wenn der Anwender per
Lizenz meist auf ca. 3GB RAM beschränkt wird. Davor konnte man auch in
XP in BOOT.INI mit /PAE einen PAE-Kernel an Stelle des üblichen
nonPAE-Kernels laden, offiziell unsupported. Mehr nutzbares RAM ergab
das nicht (Lizenzpolitik).
Der /3GB-Switch setzt daher auch nicht voraus, dass soviel RAM in der
Kiste steckt, der kann bereits bei 1,5GB RAM sinnvoll sein.
Andererseits lässt sich mit dem 32-Bit Kernel durch PAE auch mehr als
3-4GB Speicher verwalten, ohne dass dies irgendwas an der 2/2 oder 3/1
Adressraumteilung ändert. Kein 32-Bit Prozess kann mehr als 3GB
Adressraum erhalten, aber in Summe können z.B. 10GB RAM verwendet
werden, wenn genug Prozesse zusammen kommen und die verwendete
Windows-Lizenz dies zulässt.
Jerry schrieb:> kann mir jemand erklären, ob und wie es möglich ist, auf gängigen 32 Bit> Windows-Betriebs-Systemen volle 4 GB RAM zu nutzen?
Nein. Je nach Alter und verwendeter Hardware ist irgendwo zwischen
3,0GiB und 3,75GiB Schluss. Neue Systeme neigen dazu, jedes RAM oberhalb
von 3,0GiB jenseits der 4,0GiB-Grenze zu mappen, wo es zwar schön
aussieht und im BIOS auch brav mitzählt, aber für 32-Bit
Client-Betriebssysteme faktisch nicht verwendbar ist. Alte Systeme in
Zeiten sparsamerer Grafikkarten waren mitunter freundlicher und haben
bis zu 3,75GiB sichtbar gemacht, womit aber der Rest zwischen den
3,75GiB und der 4GiB-Grenze endgültig verloren war. Der Umfang an
nutzbarem RAM ist also mit der Zeit gesunken!
Unabhängig davon kannst du innerhalb eines normalen Prozesses nicht mehr
als 2GB nutzen (3GB mit dem erwähnten /3GB-Switch). In der Praxis
bedeutet es aufgrund von ineffizienter Adressverwaltung und diversen
Löchern und Lücken im virtuellen Adressraum, dass ein Prozess oft nicht
einmal mehr als gut 1GB RAM wirklich selbst nutzen kann. Der Rest steht
dann nur anderen Prozessen und dem Disk-Cache zur Verfügung.
Wer also einen 32-Bit Windows-Client mit mehr als 3GB RAM ausstattet,
der wettet entweder auf die Zukunft mit einem 64-Bit OS, oder hat Geld
verschwendet.
A. K. schrieb:> Wer also einen 32-Bit Windows-Client mit mehr als 3GB RAM ausstattet,> der wettet entweder auf die Zukunft mit einem 64-Bit OS, oder hat Geld> verschwendet.
Die meisten Chipsätze ziehen durchaus Nutzen aus 2 vorhanden
RAM-Bänken. Und mit Remapping gehen auch nur 0.25 GB ins Nirwana.
Wo ist da die Verschwendung?
oink schrieb:> Die meisten Chipsätze ziehen durchaus Nutzen aus 2 vorhanden> RAM-Bänken. Und mit Remapping gehen auch nur 0.25 GB ins Nirwana.
Kenne ich anders. Intel Core2 und Core i5: 4GB drin, 4GB hochgezählt,
3GB verwendet. Windows XP 32-Bit, wie auch Linux 32-Bit mit
nonPAE-Kernel.
Die 0,25GB kenne ich nur aus alten Zeiten mit PCI-Grafikkarten. Später
wurde der von PCI/AGP/PCI-Express plus GART/IOMMU beanspruchte
Adressraum wesentlich grösser. Allein eine 0,5GB Grafikkarte frisst ja
schon mindestens ebendiese 0,5GB weg.
> Wo ist da die Verschwendung?
Das restliche RAM landet jenseits der 4GB Grenze und wird von 32-Bit
Windows Clients nicht verwendet. Es soll wohl irgendwelche RAM-Disk
Software geben, die damit was anfangen kann.
Anders sieht es bei 64-Bit Windows aus. Aber darum geht es hier nicht.
> Aber darum geht es hier nicht.
Wäre dennoch interessant mal zu erfahren: Kann im 64-Bit Win XP, Vista
bzw. aktueller "7" der komplette RAM von Anwendungen (abzüglich wirklich
für's System verwendeten Speicher) genutzt werden oder nicht?