2010-04-29 9 views
31

Ich bin Mitglied in einem Team, das eine Delphi-Anwendung zu entwickeln. Die Speicheranforderungen sind riesig. 500 MB sind normal, aber in einigen Fällen wurde die Ausnahme für den Arbeitsspeicher aufgehoben. Der Speicher, der in diesen Fällen zugewiesen wird, liegt normalerweise zwischen 1000 und 1700 MB.Warum 2 GB Speicherlimit bei 64-Bit-Windows?

Wir wollen natürlich 64-Bit-Compiler, aber das wird jetzt nicht passieren (und wenn wir es in Unicode geschieht auch konvertieren müssen, aber das ist eine andere Geschichte ...).

Meine Frage ist, warum gibt es ein 2-GB-Speicherlimit pro Prozess, wenn in einer 64-Bit-Umgebung ausgeführt werden. Der Zeiger ist 32 Bit, also glaube ich, dass 4 GB das richtige Limit wären. Ich benutze Delphi 2007.

EDIT: Also, wenn ich die IMAGE_FILE_LARGE_ADDRESS_AWARE Flagge in Delphi gesetzt durch Verwendung:

{$SetPeFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} 

Und läuft die resultierende Exe-Datei auf einem x64 Windows Server 2003 dann die Anwendung Kann 4 GB adressieren?

  • Sollte ich/3GB in boot.ini schalten?
  • Wir haben versucht, dies aber auf einem 32-Bit-Windows Server 2003 und es scheint, die Fenster Ressourcen zu begrenzen. Es gab mehr Ausnahmen für "Nicht genügend Speicher" mit GDIError im Protokoll. Aber vielleicht verschwindet dies, wenn Sie in einem 64-Bit-Betriebssystem laufen?
+0

Der Schalter 3GB im Boot.Ini ist nur für 32-Bit-Windows, und es ist erforderlich für LARGEADDRESSAWARE zu arbeiten. Beachten Sie, dass der verfügbare Platz für Windows auf 32-Bit-Systemen verkleinert wird. Sehen Sie das Beispiel hier, http://blogs.technet.com/markrussinovich/archive/2009/03/26/3211216.aspx, oder lesen Sie die ausgezeichneten Windwos Internals von Russinovoch und Solomon. –

Antwort

32

Wenn Sie die Delphi-Anwendung, die/LARGEADDRESSAWARE Flagge mit kompilieren, wird es in der Lage sein, die volle Adresse 4 GB auf einem 64-Bit-Betriebssystem. Andernfalls, wenn in einem WOW32 ausgeführt wird, übernimmt das Betriebssystem, dass die App die gleiche Umgebung erwartet, dass es auf einem 32-Bit-Betriebssystem haben würde, was bedeutet, dass der 4 GB Adressraum, 2 GB für das Betriebssystem gewidmet ist und 2 GB zugeordnet wird die Anwendung.

+4

Das ist nur gültig auf 32bit. Es gibt keinen binären Unterschied zwischen einem 3-GB-Zeiger und einem 4-GB-Zeiger, sodass jede App, die 3 GB verarbeiten kann, 4 GB leisten kann./LARGEADDRESSAWARE ist gut für die vollen 4 GB auf 64-Bit-Systemen ohne irgendwelche Boot-Up-Modifikationen. Das einzige Mal, wenn Sie/3GB benötigen, ist, wenn Sie mehr Adressraum in einem 32-Bit-System verwenden möchten. Der Artikel, den Sie verlinkt haben, ist ungefähr zehn Jahre alt und adressiert nur 32-Bit-Systeme. PAE ist ein völlig anderes System. – Puppy

+0

@Dead: Ja, natürlich auf 64-Bit-Systemen (http://support.microsoft.com/kb/294418) tho der Originalartikel ist nur 5 Jahre veraltet, nicht 10. :) Die Antwort bleibt jedoch falsch/unvollständig in Bezug auf die Diskussion der Auswirkungen auf 32-Bit-Betriebssystemen. – Deltics

+1

@Deltics - LARGEADDRESSAWARE gilt nicht nur für 3GB Das ist absolut falsch. http://msdn.microsoft.com/en-us/library/wz223b1z%28VS.80%29.aspx. Dies ist ein Hinweis darauf, dass die Anwendung ** ANY ** -Adressen über 2 GB verarbeiten kann. Es ist absolut richtig, wenn Sie die volle 4 GB Adressraum auf einem 64-Bit-Betriebssystem mit einer 32-Bit-Anwendung und wenn es damit umgehen kann, können Sie den Schalter LARGEADDRESSAWARE verwenden. Ich bin mir nicht sicher, warum Sie das für falsch halten. – Thomas

6

http://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx

Benutzermodus virtuellen Adressraum für jeden 32-Bit-Prozess: 2 GB

+4

Es gibt keine Möglichkeit für Windows zu wissen, ob Delphi arithmetische oder nicht-signierte Arithmetik für Speicheradressen verwendet. Daher muss davon ausgegangen werden, dass das obere Bit unbrauchbar ist, sofern Sie nicht explizit etwas anderes deklarieren. –

+0

@Mark: Das ist, äh, überhaupt nicht wahr. Wie bereits erwähnt, ermöglicht es das Setzen eines Boot-Flags, dass Delphi mehr als 2 GB adressiert: –

+1

@BlueRaja, "Setze ein Boot-Flag" = "explizit anders deklarieren". –

14

Die Syntax in Delphi den LARGEADDRESSAWARE Flag in der PE ausführbaren Datei zu setzen:

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} 

Setzen Sie, dass in Ihrer .dpr Datei.

2

Solange Sie sich für den Empfang von 32-Bit-Zeigern mit gesetztem High-Bit entscheiden (durch Einschließen des PE-Flags LARGE_ADDRESS_AWARE), gibt es kein 2-GB-Limit.

Direkte Beobachtung

var 
    p: Pointer; 
    n: Int64; 
begin 
    p := Pointer($D0000000); //Above the 2GB line; and the 3GB line! 

    p := VirtualAlloc(p, 1024, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE); 
    if p = nil then 
     RaiseLastWin32Error; 

    n := Cardinal(p); 
    ShowMessage(IntToHex(n, 16)); 
end; 

enter image description here

Fazit

Es gibt keine Begrenzung 2GB, auf 64-Bit-Windows, solange Sie schwören, dass Sie Zeiger über $ 7FFFFFFF verarbeiten kann.

Hinweis: Jeder Code wird in die Public Domain veröffentlicht. Keine Zuordnung erforderlich.

Verwandte Themen