Физическая память выделяется в страничном файле. При запуске приложения ОС открывает его исполняемый файл и определяет объем кода и данных приложения. ОС резервирует регион адресного пространства и помечает, что физическая память, связанная с этим регионом – это сам исполнительный (ехе) файл. ОС не выделяет пространство из страничного файла, а использует истинное содержимое исполнительного (ехе) файла, как зарезервированный регион адресного пространства. Программный файл, размещённый на жестком диске и используемый как физическая память для того или иного региона адресного пространства, называется файлом, проецируемым в память. Windows резервирует регион. Файлы Windows готовы к "употреблению", в DOS необходимы
Отдельные страницы имеют различные атрибуты защиты:
1) PAGE_NOACCESS. Попытка чтения, записи, исполнения в этом регионе памяти вызовет нарушение доступа.
2) PAGE_READONLY. Попытка записи, исполнения в этом регионе памяти вызовет нарушение доступа.
3) PAGE_READWRITE. Попытка исполнения в этом регионе памяти вызовет нарушение доступа.
4) PAGE_EXECUTE. Попытка чтения, записи в этом регионе памяти вызовет нарушение доступа.
5) PAGE_EXECUTE_READWRITE. Данный регион допускает любые операции.
6) PAGE_EXECUTE_READ. Попытка записи в этом регионе памяти вызовет нарушение доступа.
7) PAGE_WRITECOPY. Попытка исполнения в этом регионе памяти вызовет нарушение доступа. Запись в память этого региона приводит к тому, что процессу предоставляется личная копия данной страницы физической памяти.
8) PAGE_EXECUTE_WRITECOPY. Данный регион допускает любые операции.
В Windows 95 используются 1,2 и 3 атрибуты защиты. Кроме рассмотренных атрибутов защиты существуют два флага: PAGE_NOCACHE – отключает кэширование выделенной страницы. Использовать его не рекомендуется. В основном используется этот флаг разработчиками драйверов; PAGE_GUARD – специальный флаг. Используется при работе стека потока. Windows 95 эти флаги игнорирует. Флаги защиты можно объединять, используя логическую операцию OR. Для изменения атрибутов используется функция VirtualProtect(...).
Виртуальное адресное пространство
//////////////////////////////////////////////////
//////////////////////////////////////////////
Программный код или данные
Защиты типа PAGE_WRITECOPY и PAGE_EXECUTECOPY предназначены для экономного расходования оперативной памяти и места в страничном файле. В Win32 поддерживается механизм, позволяющий двум или более процессам получать одновременный доступ к единому блоку данных. Например:
1-я копия Физическая память 2-я копия
Чтобы предотвратить одновременную запись в общий блок данных разными процессами ОС присваивает этому блоку данных атрибут защиты копирования при записи. Когда поток в одном процессе пытается записать что-нибудь в общий блок данных, то он
1) выделяет из страничного файла страницу физической памяти
2) отыскивает свободную страницу в памяти
3) копирует страницу с данными, которые поток пытается записать в общий блок на свободную страницу памяти, полученную на этапе 2
4) сопоставляет адрес этой страницы виртуальной памяти с новой страницей в памяти.
После этих действий ОС получает собственную копию этого блока данных и может делать с ней, что хочет. Windows 95 и Windows 98 не поддерживают копирование рпи записи.