Системная информация
Многие параметры операционной системы (размер страницы, гранулярность выделения памяти и др) зависят от используемого в компьютере процессора. Поэтому нельзя жестко "зашивать" их значения в исходный код пpoгpaмм. Эту информацию надо считывать в момент инициализации процесса с помощью функции GetSystemfnfo:
VOID GetSystemInfo(LPSYSTEM_INFO psinf);
Вы должны передать в GetSystemInfo адрес структуры SYSTEM_INFO, и функция инициализирует элементы этой структуры:
typedef struct _SYSTEM_INFO
{
union
{
DWORD dwOemIdж
// не используйте этот элемент он устарел
struct
{
WORD wProcessorArchitecture;
WORD wRescrved;
};
};
DWORD dwPageSize;
LPVOID lpMinimurnApplirationAddress;
LPVOID lpMaximumApplicationAddress;
DWORD_PTR dwActiveProcessorMask;
DWORD dwNumberOfProcessors;
DWORD dwProcessorType;
DWORD dwAllocationGranularity;
WORD wProcessorLevel;
WORD wProcessorRpvi4inn;
} SYSTEM INFO *LPSYSlEM_INFO;
При загрузке система определяет значения элементов этой структуры, для конкретной системы их значения постоянны Функция GetSystemInfo предусмотрена специально для того, чтобы и приложения могли получать эту информацию. Из всех элементов структуры лишь четыре имеют отношение к памяти. Они описаны в следующей таблице.
Элемент | Описание | ||
dwPageStze | Размер страницы памяти. На процессорах x86 это значение ра но 4096, а на процессорах Alpha — 8192 байтам. | ||
IpMinimumApplicationAddress | Минимальный адрес памяти доступного адресного пространен для каждого процесса. В Windows 98 это значение равно 4 194 304, или 0x00400000, поскольку нижние 4 Мб адресного пространства каждого процесса недоступны. В Windows 2000 это значение равно 65 536, или 0x00010000, так как в этой сие теме резервируются лишь первые 64 Кб адресного пространст каждого процесса. | ||
lpMaximwnApplicationAddress | Максимальный адрес памяти доступного адресного простран ства, отведенного в "личное пользование" каждому процессу. В Windows 98 этот адрес равен 2 147 483 647, или 0x7FFFFFFF, так как верхние 2 Гб занимают общие файлы, проецируемые в память, и разделяемый код операционной системы. В Windows 2000 этот адрес соответствует началу раздела для кода и данных режима ядра за вычетом 64 Кб. | ||
dwAllocationGranularity | Гранулярность резервирования регионов адресного простран ства На момент написания книги это значение составляет 64 для всех платформ Windows. |
Остальные элементы этой структуры показаны в таблице ниже.
Элемент | Описание |
dwOemld | Устарел, больше не используется |
wReserved | Зарезервирован на будущее; пока не используется |
dwNumberOfProcessors | Число процессоров в компьютере |
dwActiveProcessorMask | Битовая маска, которая сообщает, какие процессоры активны (выполняют потоки) |
dwProcessorType | Используется только в Windows 98; сообщает тип процессора, например Intel 386, 486 или Pentium |
wProcessorArchitecture | Используется только в Windows 2000; сообщает тип архитектуры процессора, например Intel, Alpha, 64-разрядный Intel или 64-разрядный Alpha |
wProcessorLevel | Используется только в Windows 2000; сообщает дополнительные подробности об архитектуре процессора, например Intel Pentium Pro или Pentium II |
wProcessorRevision | Используется только в Windows 2000; сообщает дополнительные подробности об уровне данной архитектуры процессора |