Как определить более 4 ГБ оперативной памяти на 32-разрядной машине - PullRequest
4 голосов
/ 29 октября 2009

Я знаю, что 32-разрядная ОС не может видеть более 4 ГБ ОЗУ.
Так что, если бы я должен был установить, скажем, 6 ГБ ОЗУ на машине с 32-битной ОС, есть ли способ идентифицировать это?
Я знаю, что один из способов получить установленную оперативную память - через класс WMI: win32_physicalmemory.Capacity
Но я не знаю, будет ли он отображать правильный размер оперативной памяти, а не поддерживаться.
У меня нет настройки для тестирования этого сценария, но если кто-то уже знает это, пожалуйста, подтвердите.
Иначе, пожалуйста, дайте мне знать, если есть какой-то другой способ сделать то же самое. Я спрашиваю это для любой 32-битной ОС Windows.

Заранее спасибо.
Самрат Патил.

Ответы [ 3 ]

4 голосов
/ 29 октября 2009

32-битные операционные системы МОГУТ видеть более 4 ГБ памяти с процессорами с поддержкой PAE . Просто 32-битное адресное пространство ограничено 4 ГБ. Но поскольку приложение имеет доступ только к своему собственному виртуальному адресному пространству, оно не может определить, находится ли часть выделенной памяти в 1-м или 5-м гигабайте памяти.

В Windows вы можете использовать функцию GetPhysicallyInstalledSystemMemory :

Функция

извлекает объем физически установленной оперативной памяти из таблиц микропрограммного обеспечения компьютера SMBIOS. Это может отличаться от объема, сообщаемого функцией GlobalMemoryStatusEx, которая устанавливает член ullTotalPhys структуры MEMORYSTATUSEX равным количеству физической памяти, доступной для используемой операционной системы.

Подробнее: http://www.geoffchappell.com/viewer.htm?doc=notes/windows/license/memory.htm

1 голос
/ 29 октября 2009

Есть довольно приятная функция GlobalMemoryStatusEx , которая должна решить вашу проблему. Это возвращает

typedef struct _MEMORYSTATUSEX {
  DWORD     dwLength;
  DWORD     dwMemoryLoad;
  DWORDLONG ullTotalPhys;
  DWORDLONG ullAvailPhys;
  DWORDLONG ullTotalPageFile;
  DWORDLONG ullAvailPageFile;
  DWORDLONG ullTotalVirtual;
  DWORDLONG ullAvailVirtual;
  DWORDLONG ullAvailExtendedVirtual;
}MEMORYSTATUSEX, *LPMEMORYSTATUSEX;

Я думаю, что вы ищете ullTotalPhys. Все значения в байтах.

1 голос
/ 29 октября 2009

WMI сообщает обо всех размерах памяти как uint64, как видно из документации для Win32_OperatingSystem .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...