Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows


             

В Windows 98 стеки ведут


В Windows 98 стеки ведут себя почти так же, как и в Windows 2000. Но отличия все же есть.

На рис. 16-4 показано, как в Windows 98 может выглядеть регион стека (зарезер вированный с адреса 0x00530000) размером 1 Мб.



































































Адрес



Размер



Состояние страницы



0x00640000



16 страниц (65 536 байтов)



Верхняя часть стека (зарезервирована для перехвата обращений к несуществующей области стека)



0x0063F000



1 страница (4096 байтов)



Переданная страница с атрибутом PAGE_READWRITE (задействованная область стека)



0x0063E000



1 страница (4096 байтов)



Страница с атрибутом PAGE_NOACCESS (заменяет флаг PAGE_GUARD)



0x00638000



6 страниц (24 576 байтов)



Страницы, зарезервированные для перехвата переполнения стека



0x00637000



1 страница (4096 байтов)



Переданная страница с атрибутом PAGE_READWRITE (для совместимости с 16-разрядными компонентами)



0x00540000



247 страниц (1 011 712 байтов)



Страницы, зарезервированные для дальнейшего расширения стека



0x00530000



16 страниц (65 536 байтов)



Нижняя часть стека {зарезервирована для перехвата переполнения стека)



Рис. 16-4. Так выглядит регион стека сразу после его создания под управлением Windows 98

Во-первых, размер региона на самом дслс 1 Мб плюс 1 28 Кб, хотя мы хотели соз дать стек объемом всего 1 Мб. В Windows 98 система резервирует под стек на 128 Кб больше, чсм было запрошено. Собственно стек располагается в середине этого реги она, а по обеим его границам размещаются блоки по 64 Кб каждый.

Блок перед стеком предназначен для перехвата его переполнения, а блок после стска — для перехвата обращений к несуществующим областям стека. Чтобы понять, какая польза от последнего блока, рассмотрим такой фрагмент кода:

int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PSTR pszCmdLine, int nGmdShow)
{

char szBuf[100];

szBuf[10000] - 0; // обращение к несуществующей области стека

return(0);

}

Когда выполняется оператор присвоения, происходит попытка обращения за ко нец стека потока. Разумеется, ни компилятор, ни компоновщик не уловят эту ошибку в приведенном фрагменте кода, по, если приложение работает под управлением Win


Содержание    Вперед