Защита памяти

Память, принадлежающая процессу, неявно защищена частным виртуальным адресным пространством. Кроме того, Windows обеспечивает защиту памяти с помощью оборудования виртуальной памяти. Реализация этой защиты зависит от процессора, например, кодовые страницы в адресном пространстве процесса могут быть помечены как доступные только для чтения и защищены от изменения потоками в пользовательском режиме.

Полный список атрибутов см. в разделе "Константы защиты памяти".

Защита копирования при записи

Защита копирования при записи — это оптимизация, которая позволяет нескольким процессам сопоставлять виртуальные адресные пространства, чтобы они совместно используют физическую страницу, пока один из процессов не изменит страницу. Это часть метода, называемого отложенной оценкой, которая позволяет системе сохранять физическую память и время, не выполняя операцию до абсолютно необходимого.

Предположим, что два процесса загружают страницы из одной библиотеки DLL в виртуальные пространства памяти. Эти страницы виртуальной памяти сопоставляются с одинаковыми страницами физической памяти для обоих процессов. Если ни один процесс не записывает на эти страницы, они могут сопоставлять и совместно использовать те же физические страницы, как показано на следующей схеме.

boxes and arrows of process 1 and 2 pages mapped to same physical memory

Если процесс 1 записывает на одну из этих страниц, содержимое физической страницы копируется на другую физическую страницу, а карта виртуальной памяти обновляется для процесса 1. Теперь оба процесса имеют собственный экземпляр страницы в физической памяти. Таким образом, невозможно записать один процесс на общую физическую страницу, а другой — увидеть изменения.

boxes and arrows of processes and physical memory remapping

Загрузка приложений и библиотек DLL

При загрузке нескольких экземпляров одного приложения на основе Windows каждый экземпляр запускается в собственном защищенном виртуальном адресном пространстве. Однако их дескриптора экземпляра (hInstance) обычно имеют одинаковое значение. Это значение представляет базовый адрес приложения в виртуальном адресном пространстве. Если каждый экземпляр можно загрузить в базовый адрес по умолчанию, он может сопоставлять и совместно использовать одни и те же физические страницы с другими экземплярами с помощью защиты копирования при записи. Система позволяет этим экземплярам совместно использовать одни и те же физические страницы, пока один из них не изменит страницу. Если по какой-то причине один из этих экземпляров не может быть загружен в нужный базовый адрес, он получает свои собственные физические страницы.

Библиотеки DLL создаются с базовым адресом по умолчанию. Каждый процесс, использующий библиотеку DLL, попытается загрузить библиотеку DLL в отдельном адресном пространстве по умолчанию виртуального адреса библиотеки DLL. Если несколько приложений могут загружать библиотеку DLL по своему виртуальному адресу по умолчанию, они могут совместно использовать одни и те же физические страницы для библиотеки DLL. Если по какой-либо причине процесс не может загрузить библиотеку DLL по адресу по умолчанию, она загружает библиотеку DLL в другом месте. Защита при копировании при записи заставляет некоторые страницы БИБЛИОТЕКи DLL копироваться на разные физические страницы для этого процесса, так как исправления для инструкций перехода написаны на страницах БИБЛИОТЕКИ DLL, и они будут отличаться для этого процесса. Если раздел кода содержит много ссылок на раздел данных, это может привести к копированию всего раздела кода на новые физические страницы.