Структура адресного простору

Прийнято вважати, що кожен процес, запущений в Windows, отримує в своє розпорядження віртуальний адресний простір розміром 4 Гб. Це число визначається розрядністю адрес в командах: 232 байт = 4 Гб.

Звичайно, важко розраховувати, що для кожного процесу знайдеться така кількість фізичної пам'яті, мова йде тільки про діапазоні можливих адрес.

Але навіть і в цьому сенсі процесу доступно лише близько 2 Гб молодших адрес віртуальної пам'яті. Зокрема, для Windows NT старші 2 Гб з адресами від 8000000016 до FFFFFFFF16 доступні тільки системі. Таке рішення дозволило зменшити час, що витрачається при виклику системних функцій, оскільки відпадає необхідність змінювати при цьому відображення сторінок, потрібно тільки дозволити їх використання. Однак, щоб сам виклик API-функцій був можливий, системні бібліотеки, які містять ці функції, розміщуються в молодшій, користувацької половині віртуального простору.

У Windows 95 прийнято хуліганське рішення: система і тут розташовується в старшій половині пам'яті, але ця половина доступна процесу користувача і для читання, і для запису. При цьому виклик системи стає ще простіше, але зате система стає беззахисною перед будь некоректної програмою, що лізуть куди не треба.

Крім старших 2 Гб, процесу недоступні ще деякі невеликі області на початку і в кінці віртуального простору. У Windows NT недоступні адреси з 0000000016 по 0000FFFF16 і з 7FFF000016 по 7FFFFFFF16, тобто два шматочки по 64 Кб. Це зроблено з метою виявлення такої типової помилки програмування, як використання неініціалізувати покажчиків, які зазвичай потрапляють в заборонені діапазони адрес.

Для 64-розрядних процесорів розмір віртуального адресного простору зростає до важко представимих 264 байт (17000000000 гігабайт, якщо завгодно), однак Windows XP виділяє в розпорядження кожного процесу «всього лише» 7152 гігабайти з адресами від 0 до 6FBFFFFFFFF16, а інше адресний простір може використовуватися тільки системою.