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

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

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

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

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

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

поля и стрелки процесса 1 и 2 страниц, сопоставленные с одной физической памятью

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

поля и стрелки процессов и переназначения физической памяти

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

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

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