Передача региону физической памяти




Чтобы зарезервированный регион адресного пространства можно было использовать, Вы должны выделить физическую память и спроецировать её на этот регион. Такая операция называется передачей физической памяти (committing physical storage). Чтобы передать физическую память зарезервированному региону, Вы обращаетесь все к той же функции VirtualAlloc.Передавая физическую память регионам, нет нужды отводить ее целому региону. Можно, скажем, зарезервировать регион размером 64 Кб и нередать физическую память только его второй и четвертой страницам. Когда физическая память, переданная зарезервированному региону, больше не нужна, ее освобождают. Эта операция — возврат физической памяти (decommitting physical storage) — выполняется вызовом функции VirtualFree.

Физическую память следует рассматривать как данные, хранимые в дисковом файле со страничной структурой. Поэтому, когда приложение передает физическую память какому-нибудь региону адресного пространства (вызывая VirtualAttoc), она на самом деле выделяется из файла, размещенного на жестком диске. Размер страничного файла в системе — главный фактор, определяющий количество физической памяти, доступное приложениям. Реальный объем оперативной памяти имеет гораздо меньшее значение. Физическая память в страничном файле не хранится Windows 2000 может использовать несколько страничных файлов, и, если они расположены на разных физических дисках, операционная система работает гораздо быстрее, поскольку способна вести запись одновременно на нескольких дисках. Чтобы добавить или удалить страничный файл, откройте в Control Panel апплет System, выберите вкладку Advanced и щелкните кнопку Performance Options. Нa экране появится следующее диалоговое окно.

Однако система действует не так, иначе на загрузку и подготовку программы к запуску уходило бы слишком много времени.При запуске приложения система открывает его исполняемый файл и определяет объем кода и данных. Затем резервирует регион адресного пространства и помечает, что физическая память, связанная с этим регионом, — сам ЕХЕ-файл,то есть вместо выделения какого-то пространства из страничного файла система использует истинное содержимое, или образ (image) ЕХЕ-файла как зарезервированный регион адресного пространства программы. Благодаря этому приложение загружается очень быстро, а размер страничного файла удается заметно уменьшить. Образ исполняемого файла (т. e. EXE- или DLL-файл), размещенный на жестком диске и применяемый как физическая память для того или иного региона адресного пространства, называется проецируемым в память файлом (memory-mapped file). При загрузке EXF, или DLL система автоматически резервирует регион адресного пространства и проецирует на него образ файла. Помимо этого, система позволяет (с помощью набора функций) проецировать на регион адресного пространства еще и файлы данных

Когда EXE- или DLL-файл загружается с дискеты Windows 2000 целиком копируют его в оперативную память, а в страничном файле выделяют такое пространство, чтобы в нем мог уместиться образ загружаемого файла. Если нагрузка на оперативную память в системе невелика, EXE- или DLLфайл всегда запускается непосредственно из оперативной памяти.Так сделано для корректной работы программ установки. Обычно программа установки запускается с первой дискеты, потом поочередно вставляются следующие диски, на которых собственно и содержится устанавливаемое приложение. Если системе понадобится какой-то фрагмент кода EXE- или DLLмодуля программы установки, на текущей дискете его, конечно же, пет. Но, поскольку система скопировала файл в оперативную память (и предусмотрела для него место в страничном файле), у нее не возникнет проблем с доступом к нужной части кода программы установки

Атрибуты защиты

Отдельным страницам физической памяти можно присвоить свои атрибуты защиты показанные в следующей таблице.

Атрибут защиты Описание
PAGE_NOACCESS Попытки чтения, записи или исполнения содержимого памяти на этой странице вызывают нарушение доступа
PAGE_READONLY Попытки записи или исполнения содержимого памяти на этой странице вызывают нарушение доступа
PAGE_READWRITE Попытки исполнения содержимого памяти на этой странице вызывают нарушение доступа
PAGE_EXECUTE Попытки чтения или записи на этой странице вызывают нарушение доступа
PAGE_EXECUTE_READ Попытки записи на этой странице вызывают нарушение доступа
PAGE_EXECUTE_READWRITE На этой странице возможны любые операции
PAGE_WRITECOPY Попытки исполнения содержимого памяти на этой странице выбывают нарушение доступа, попытка записи приводит к тому, что процессу предоставляется "личная" копия данной страницы
PAGE_EXECUTE_WRITECOPY На этой странице возможны любые операции, попытка записи приводит к тому, что процессу предоставляется "личная" копия данной страницы

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

Атрибуты защиты, перечисленные в предыдущей таблице, достаточно понятны, кроме двух последних: PAGE_WRITECOPY и PAGE_EXECUTE_WRITECOPY. Они предназначены специально для экономного расходования оперативной памяти и места в страничном файле. Windows поддерживает мехянизм, позволяющий двум и более процессам разделять один и тот же блок памяти. Например, если Вы запустите 10 экземпляров программы Notepad, все экземпляры будут совместно использовать одни и те же страницы с кодом и данными этой программы. И обычно никяких проблем не возникает — пока процессы ничего не записывают в общие блоки памяти. Только представьте, что творилось бы в системе, если потоки из разных процессов начали бы одновременно записывать в один и тот же блок памяти!

Чтобы предотвратить этот хаос, операционная система присваивает общему блоку памяти атрибут защиты "копирование при записи" (copy-on-write). Когда поток в одном процессе попытается что-нибудь записать в общий блок памяти, в дело тут же вступит система и проделает следующие операции:

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

Скопирует страницу с данными, которые поток пытается записать в общий блок памяти, на свободную страницу оперативной памяти, полученную на этапе 1. Последней присваивается атрибут защиты PAGE_WRITECOPY или PAGE_EXECUTE_WRITECOPY. Атрибут защиты и содержимое исходной страницы не меняются.

Отобразит виртуальный адрес этой страницы в процессе на новую страницу в оперативной памяти.

Когда система выполнит эти операции, процесс получит свою копию нужной страницы памяти.

Кроме того, при резервировании адресного пространства или передаче физической памяти через VirtualAlloc нельзя указывать атрибуты PAGE_WRITECOPY или PAGE_EXECUTE_WRITECOPY. Иначе вызов VirtualAlloc даст ошибку, a GetLastError вернет код ERROR_INVALID_PARAMETER. Дело в том, что эти два атрибута используются операционной системой, только когда она проецирует образы EXE- или DLL-файлов.

Базовый адрес Тип Размер Блоки Атрибут(ы) защиты Описание
  Free        
  Private     -RW-  
  Free G1440      
  Private     -RW-  
000? 1000 Free        
  Private     -HW- Стек потока
  Private     -RW-  
  Mapped     -RW-  
  Mapped     -R- \Device\HarddiskVolume1\WINN7\system32\unicode.nls
  Free        
  Mapped     -R- \Device\HarddiskVolume1\WINNT\system32\locale.nIs
  Free        
002A0000 Happed     -R- \Pevicc\HarddiskVolume1\WINNT\system32\sortkey.nls
002E1000 Free        
002F0000 Mapped     -R- \Device\HarddiskVolume1\WINNT\system32\sorttbls.nls
002F4000 Free        
  Mapped     ER-  
0003С8000 Free        
  Image     ERWC С \CD\x86\Debug\14_VMMap.ехе
0041A000 Free        
  Mapped     -R-  
  Free        
  Mapped     ER  
  Private     -RW-  
  Free        
  Private     -RW-  
  Free        
  Private     -RW-  
007A0000 Mapped     -R- \Device\HarddiskVolume1\WINNT\system32\ctype.nls
007А2000 Free        
699D0000 Image     ERWC C:\WINNT\Systpm32\PSAPI dll
6990В000 Free        
77D50000 Image     ERWC С:\WINNT\system32\RPCRT4 DLL
770ВЕ000 Free        
770С0000 Image     ERWC С:\WINNT\system32\ADVAPI32 dll
77Е14000 Free        
77E20000 Image     ERWC C:\WINNT\system32\USER32 dll
77Е82000 Free        
77Е90000 Image     ERWC С \WINNT\system32\KERNEL32.dll
77F40000 Image     ERWC С \WINKT\system32\GUI32 DLL
77F7В000 Free        
77FB0000 image     ERWC С \WINNT\System32\ntdll.dll
77FF000 Free        
  Image     bMWC С \WINNT\system32\MSVCRI.dll
  Free        
7F6F0000 Mapped     ER--  
7F7F0000 Free        
7FFB0000 Mapped     -R--  
7FFD4000 Free        
7FFDE000 Private     ERW-  
7FFDF000 Private     ERW-  
7FFE0000 Private     -R--  

Таблица 13-2. Образец карты адресного пространства процесса в Windows 2000 на 32-разрядном процессоре типа x86

Во втором поле показывается тип региона Free (свободный), Private (закрытый), Image (образ) или Mapped (проецируемый). Эти типы описаны в следующей таблице,

Тип Описание
Free Этот диапазон виртуальных адресов не сопоставлен ни с каким типом физической памяти. Его адресное пространство не зарезервировано, приложение может зарезервировать регион по указанному базовому адресу или в любом месте в границах свободного региона
Private Этот диапазон виртуальных адресов сопоставлен со страничным файлом.
Image Этот диапазон виртуальных адресов изначально был сопоставлен с образом ЕХЕ- или DLL-файла, проецируемого в память, но теперь, возможно, уже нет. Например, при записи в глобальную переменную из образа модуля механизм поддержки "копирования при записи" выделяет соответствующую страницу памяти из страничного файла, а не исходною образа файла.
Mapped Этот диапазон виртуальных адресов изначально был сопоставлен с файлом данных, проецируемым в память, но теперь, возможно, уже нет. Например, файл данных мог быть спроецирован с использованием механизма поддержки "копирования при записи". Любые операции записи в этот файл приведут к тому, что соответствующие страницы памяти будут выделены из страничного файла, а не из исходного файла данных.

В третьем поле сообщается размер региона в байтах. Например, система спроецировала образ User32.dll по адресу 0x77E20000. Когда она резервировала адресное пространство для этого образа, ей понадобилось 401 408 байтов. Не забудьте, что в третьем поле всегда содержатся значения, кратные размеру страницы, характерному для данного процессора (4096 байтов для x86).В четвертом поле показано количество блоков в зарезервированном регионе. Блок — это неразрывная группа страниц с одинаковыми атрибутами защиты, связанная с одним и тем же типом физической памяти.Для свободных регионов это значение всегда равно 0, так как им не передается физическая память. (Поэтому в четвертой графе никаких данных для свободных регионов не приводится.) Но для занятых регионов это значение может колебаться в пределах от 1 до максимума (его вычисляют делением размера региона на размер страницы). Скажем, у региона, начинающегося с адреса Ox77E20000, размер — 401 408 байтов. Поскольку процесс выполняется на процессоре x86 (страницы памяти по 4096 байтов), максимальное количество блоков в этом регионе равно 98 (401 408/4096); ну а, судя по карте, в нем содержится 4 блока.

В пятом поле — атрибуты защиты региона. Здесь используются следующие сокращения: E - execute (исполнение), R - read (чтение), W - write (запись), С - copy-onwrite (копирование при записи). Если ни один из атрибутов в этой графе не указан, регион доступен без ограничений. Атрибуты защиты не присваиваются и свободным регионам. Кроме того, здесь Вы никогда не увидите флагов атрибутов защиты PAGE_ GUARD или PAGE_NOCACHE — они имеют смысл только для физической памяти, а не для зарезервированного адресного пространства. Атрибуты защиты присваиваются регионам только эффективности ради и всегда замещаются атрибутами защиты, присвоенными физической памяти.

В шестом (и последнем) поле кратко описывается содержимое текущего региона. Для свободных регионов оно всегда пустое, а для закрытых — обычно пустое

Блоки внутри регионов

Попробуем увеличить детализацию адресного пространства (по сравнению с тем, что показано в таблице 13-2). Например, таблица 13-3 показывает ту же карту адресного пространства, но в другом "масштабе": по ней можно узнать, из каких блоков состоит каждый регион.

Базовый адрес Тип Размер Блоки Атрибут(ы) защиты Описание
  Free        
  Private     -RW-  
  Private     -RW-  
  Free        
  Private     -HW-  
  Private     -HW- ---  
  Free        
  Private     -RW- Стек потока
  Reserve     -RW- s—  
0010D000 Private     -RW- G-  
0010E000 Private     -RW- ---  
  Private   ? -RW-  
  Private     -RW- ---  
  Reserve     -RW- ---  
  Mapped     -RW-  
  Mapped     -RW- ——  
  Reserve     -RW- ---  
  Mapped     -R — \Device\HarddiskVoluume1\WTNNT\system32\unicode.nls
  Happed     R  
  Free 409GO      
  Mapped     -R-- \Device\HarddiskVoluume1\WTNNT\system32\locale.nls
  Mapped     -R-- ---  
  Free        
002А0000 Happed     -R — \Device\HarddiskVoluume1\WTNNT\system32\sortkey.nls
002А0000 Mapped     -R-- ---  
002Е1000 Free        
002F0000 Mapped     -R- \Device\HarddiskVoluume1\WTNNT\system32\sorttbls.nls
002F0000 Mapped     -R-- ---  
002F4000 Free        
  Mapped     ER-  
  Mapped     ЕR-- —--  
  Reserve     ER-- ---  
003C0000 Mapped     ER-- ---  
ОО3С2000 Reserve     ER-- ---  
ОО3С8000 Free        
  Image     ERWC С:\CD\x86\Debug\14_VMMap.exe
  Image     -R-- ---  
  Image     ЕR-- —--  
  Image     -R-- ---  
  Image     -RW- ---  
  Image     -R-- ---  
0041А000 Free        
  Mapped     -R-  
  Mapped     -R- ---  
  Free        
  Mapped     ER--  
  Mapped     ER-- ---  
004B3000 Reserve     ER-- ---  
  Private     -RW- ---  
  Privale     -RW- ---  
  Free        
  Pr ivate     -RW- ---  
  Private     -RW- ---  
  Free        
  Private     -RW- ---  
  Private     -RW- ---  
  Reserve     -RW- ---  
007А0000 Mapped     -R-- --- \Device\HarddiskVolume1\WINNT\system32\ctype.nls
007А0000 Mapped     -R-- ---  
007A2000 Free        
007В0000 Private     -RW- ---  
007В0000 Private     -RW- ---  
007В1000 Reserve     -RW- ---  
  Free        
699D0000 Image     ERWC С:\WINNT\Systern32\PSAPI.dll
699D0000 Image     -R-- ---  
  Image     ER- ---  
699D5000 Image     -RWC ---  
699D9000 Image     -R-- ---  
699DB000 Free        
77D50000 Imago     ERWC C:\WINNT\system32\RPCRT4.DLL
77D50000 Image     -R-- ---  
77D51000 image     ER-- ---  
77DB8000 Image 409G   -RW- ---  
77DB9000 Image     -R-- ---  
77DBE000 Free        
77DC0000 Image     ERWC С:\WINNT\syatem32\ADVAPI32.dll
77DC0000 Image     -R-- ---  
77DС1000 Image     ER-- ---  
77Е0С000 Image     -RW- ---  
77E00000 Image     -RWC ---  
77Е0E000 Image     -R-- ---  
77Е14000 Free        
77E20000 Image     ERWC С:\WINNT\system32\USER32.dll
/7Е20000 Image     -R-- ---  
77Е21000 Image     ER-- ---  
77Е76000 Image     -RW- ---  
77Е77000 Image     -R-- ---  
77Е82000 Free        
77Е90000 Image     ERWC С \WINNT\system32\KERNEL32.dll
77Е90000 Image     -R-- ---  
77Е91000 Image     ER-- ---  
77ЕЕВ000 Image     -RW- ---  
77EED000 Image     -RWC ---  
77ЕЕЕ000 Image     -R-- ---  
77F40000 Image     ERWC С \WINNT\system32\GDI32.DLL
77F40000 Image     -R-- ---  
77F41000 Image     ER-- ---  
77F77000 Image     -RW- ---  
77F78000 Image     -R-- ---  
77F7B000 Free        
77F80000 Image     ERWC С \WINT\System32\ntdll.dll
77F80000 Image 409b   -R-- ---  
77F81000 Image     ER-- ---  
77FCA000 Image     RW- ---  
77FCC000 Image     -RWC ---  
77FCD000 Image     -R-- ---  
77FF6000 Free        
  Image     ERWC С \WINNT\system32\MSVCRT.dll
  Image     -R-- ---  
  Image     ER-- ---  
  Image     -R-- ---  
7803С000 Image     -RW- ---  
7803F000 Image     -RWC ---  
  Image     -R-- ---  
  Free        
7F6F0000 Mapped     ER-- ---  
7F6F0000 Mapped     ER-- ---  
7F6F7000 Reserve     ER-- ---  
7F7F0000 Free        
7FFB0000 Mapped     -R-- ---  
7FFB0000 Mapped     -R-- ---  
7FFD4000 Free        
7FFDE000 Private     ERW ---  
7FFDE000 Private     ERW ---  
7FFDF000 Private     ERW ---  
7FFDF000 Private     ERW ---  
7FFF0000 Private     -R-- ---  
7FFE0000 Private     -R-- ---  
7FFE1000 Reserve     -R-- ---  

Таблица 13-3. Образец карты адресного пространства процесса (с указанием блоков внутри регионов) в Windows 2000 на 32-разрядном процессоре типа x86

В первом поле показывается адрес группы страниц с одинаковыми состоянием и атрибутами защиты. Например, по адресу 0x77E20000 передана единственная страница (4096 байтов) физической памяти с атрибутом защиты, разрешающим только чтение. А по адресу 0x77E21000 присутствует блок размером 85 страниц (348 160 байтов) переданной памяти с атрибутами, разрешающими и чтение, и исполнение. Если бы атрибуты защиты этих блоков совпадали, их можно было бы объединить, и тогда на карте памяти появился бы единый элемент размером в 86 страниц (352 256 байтов). Во втором поле сообщается тип физической памяти, с которой связан тот или иной блок, расположенный в границах зарезервированного региона. В нем появляется одно из пяти возможных значений: Free (свободный), Private (закрытый), Mapped (проецируемый), Image (образ) или Reserve (резервный). Значения Private, Mapped и Image говорят о том, что блок поддерживается физической памятью соответственно из страничного файла, файла данных, загруженного EXE- или DLL-модуля. Если же в поле указано значение Free или Reserve, блок вообще не связан с физической памятью.

Чаще всего блоки в пределах одного региона связаны с однотипной физической памятью. Однако регион вполне может содержать несколько блоков, связанных с физической памятью разных типов. Например, образ файла, проецируемого в память, может быть связан с EXE- или DLL-файлом. Если Вам понадобится что-то записать на одну из страниц в таком регионе с атрибутом защиты PAGE_WRITECOPY или PAGE_EXECUTE_WRITECOPY, система подсунет Вашему процессу закрытую копию, связанную со страничным файлом, а не с образом файла. Эта новая страница получит те же атрибуты, что и исходная, но без защиты по типу "копирование при записи".

В третьем поле проставляется размер блока. Все блоки непрерывны в границах региона, и никаких разрывов между ними быть не может.

В четвертом поле показывается количество блоков внутри зарезервированного региона.

В пятом поле выводятся атрибуты защиты и флаги атрибутов защиты текущего блока. Атрибуты защиты блока замещают атрибуты защиты региона, содержащего данный блок. Их допустимые значения идентичны применяемым для регионов; кроме того, блоку могут быть присвоены флаги PAGE_GUARD, PAGE_WRITECOMBINE и PAGE_NOCACHE, недопустимые для региона.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-05-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: