Windows для профессионалов


Стек потока в Windows 98


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

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

h16-04.jpg

Адрес

Размер

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

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

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

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

char szBuf[100];

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

return(0);

}

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


Начало  Назад  Вперед



Книжный магазин