Why 2 GB memory limit when running in 64 bit Windows?

瘦欲@ 提交于 2019-11-28 18:14:27

If you compile the Delphi application using the /LARGEADDRESSAWARE flag, it will be able to address the full 4GB on a 64-bit OS. Otherwise, when running in a WOW32, the OS assumes that the app is expecting the same environment that it would have on a 32-bit OS which means that of the 4GB of address space, 2GB is dedicated for the OS and 2GB is allocated to the application.

The syntax in Delphi to set the LARGEADDRESSAWARE flag in the PE executable is:

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

Put that in your .dpr file.

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

User-mode virtual address space for each 32-bit process: 2 GB

As long as you opt into receiving 32-bit pointers with the high-bit set (by including the LARGE_ADDRESS_AWARE PE flag), there is no 2GB limit.

Direct Observation

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;

Conclusion

There is no 2GB limit, on 64-bit Windows, as long as you swear you can handle pointers above $7FFFFFFF.

Note: Any code is released into the public domain. No attribution required.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!