Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Создание эффективных приложений для Windows Джеффри Рихтер 2004 (Книга).pdf
Скачиваний:
375
Добавлен:
15.06.2014
Размер:
8.44 Mб
Скачать

И последнее. Ключевое слово _unaligned на процессорах типа x86 компилятором Vtsual С/С++ не поддерживается. На этих процессорах оно просто не нужно. Но это

означает, что версия компилятора для процессоров x86, встретив в исходном коде ключевое слово _unaligned, сообщит об ошибке Полому, если Вы хотите создать единую базу исходного кода приложения для обеих процессорных платформ, используйте вместо _unahgned макрос UNAUGNED Он определен в файле WmNT.h так

#if defined(_M_MRX000) || defined(_M_ALPHA) || defined(_M_IA64) #define UNALIGNED _unaligned

#if defined(_WIN64)

#define UNALIGNED64 __unaligned #else

#define UNALIGNED64 #endif

#else

#define UNALIGNED #define UNALIGNED64 #endif

ГЛАВА 14 Исследование виртуальной памяти

В предыдущей главе мы выяснили, как система управляет виртуальной памятью, как

процесс получает свое адресное пространство и что оно собой представляет А сей час мы перейдем от теории к практике и рассмотрим некоторые Windows-функции, сообщающие о состоянии системной памяти и виртуального адресного пространства в том или ином процессе

Системная информация

Многие параметры операционной системы (размер страницы, гранулярность выде ления памяти и др) зависят от используемого в компьютере процессора Поэтому нельзя жестко «зашивать» их значения в исходный код п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

Остальные элементы этой структуры показаны в таблице ниже.