В Win32 виртуальное адресное пространство каждого процесса составляет 4 Гб, т.е. соответствующий 32-битный указатель может быть числом от $00000000 до $FFFFFFFF.
Для 64-разрядных процессов размер адресного пространства равен 16 экзабайтам, поскольку 64-битный указатель может быть любым числом от 0x00000000 00000000 до 0xFFFFFFFF FFFFFFFF.
В DOS или в 16-разрядной Windows все процессы находились в едином адресном пространстве, поэтому сбой в процессе A мог привести к краху процесса B или всей ОС.
В Win32 каждому процессу отводится закрытое адресное пространство:
Например, процесс А хранит массив информации по адресу $12345678. В то же время процесс B также хранит свою информацию по тому же адресу $12345678.
Но процесс A имеет доступ к своему массиву, а процесс В к своей информации. Обращаясь к памяти по адресу 0x12345678, потоки, выполняемые в процессе А, получают доступ к структуре данных процесса А, Но, когда по тому же адресу обращаются потоки, выполняемые в процессе В, они получают доступ к структуре данных процесса В. Иначе говоря, потоки процесса А не могут обратиться к структуре данных в адресном пространстве процесса В, и наоборот
В Windows NT память ОС скрыта от других процессов, но в Windows 95 это не реализовано, поэтому любой процесс может случайным образом нарушить нормальную работу ОС.
Адресное пространство Windows 95:
Различные ОС разбивают адресное пространство на разделы по разному.
$FFFFFFFF $C0000000 |
Размер 1Гб. Код ОС, драйвера устройств, диспетчер памяти и т.д. (не защищен, доступен из любых Win32 процессов) |
$BFFFFFFF $80000000 |
Размер 1 Гб. Используется для системных DLL: Kernel32, User32, GDI32 (не защищен, доступен из любых Win32 процессов) |
$7FFFFFFF $00400000 |
Размер 2 Гб. Используется для "личных" нужд процесса. |
$003FFFFF $00001000 |
Размер 4 Мб-4Кб. Предназначен для поддержки 16 разрядных приложений DOS и Windows.(не защищен, доступен ) |
$00000FFF $00000000 |
Размер 4 Кб. Недоступен для чтения и записи, что позволяет выявлять нулевые указатели |
Адресное пространство Windows NT:
Различные ОС разбивают адресное пространство на разделы по разному.
$FFFFFFFF $C0000000 |
Размер 2Гб. Код ОС, драйвера устройств, диспетчер памяти и т.д. (Недоступен для чтения и записи) |
$7FFFFFFF $7FFF0000 |
Размер 64 Кб. Недоступен для чтения и записи, что позволяет выявлять неправильные указатели. |
$7FFEFFFF $00010000 |
Размер 2 Гб-2*64 Кб. Используется для "личных" нужд процесса.(сюда же загружаются системные DLL) |
$0000FFFF $00000000 |
Размер 64 Кб. Недоступен для чтения и записи, что позволяет выявлять нулевые указатели. |