Смекни!
smekni.com

Виртуальная память в Microsoft Windows (стр. 2 из 4)

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

Чтобы зарезервированный регион адресного пространства можно было использовать, Вы должны выделить физическую память и спроецировать её на этот регион. Такая операция называется передачей физической памяти (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-файлов.

Базовый адрес Тип Размер Блоки Атрибут( ы) защиты Описание
00000000 Free 65536
00010000 Private 4096 1 -RW-
00011000 Free G1440
00020000 Private 4096 1 -RW-
000? 1000 Free 61440
00030000 Private 1048576 3 -HW- Стек потока
00130000 Private 1048576 2 -RW-
00230000 Mapped 65536 2 -RW-
00240000 Mapped 90112 1 -R- \Device\HarddiskVolume1\WINN7\system32\unicode.nls
00256000 Free 40960
00260000 Mapped 208896 1 -R- \Device\HarddiskVolume1\WINNT\system32\locale.nIs
00293000 Free 53248
002A0000 Happed 266240 1 -R- \Pevicc\HarddiskVolume1\WINNT\system32\sortkey.nls
002E1000 Free 61440
002F0000 Mapped 16384 1 -R- \Device\HarddiskVolume1\WINNT\system32\sorttbls.nls
002F4000 Free 49152
00300000 Mapped 819200 4 ER-
0003С8000 Free 229376
00400000 Image 106496 5 ERWC С \CD\x86\Debug\14_VMMap.ехе
0041A000 Free 24576
00420000 Mapped 274432 1 -R-
00463000 Free 53248
00470000 Mapped 3145728 2 ER
00770000 Private 4096 1 -RW-
00771000 Free 61440
00780000 Private 4096 1 -RW-
00781000 Free 61440
00790000 Private 65536 2 -RW-
007A0000 Mapped 8192 1 -R- \Device\HarddiskVolume1\WINNT\system32\ctype.nls
007А2000 Free 1763893248
699D0000 Image 45056 4 ERWC C:\WINNT\Systpm32\PSAPI dll
6990В000 Free 238505984
77D50000 Image 450560 4 ERWC С:\WINNT\system32\RPCRT4 DLL
770ВЕ000 Free 8192
770С0000 Image 344064 5 ERWC С:\WINNT\system32\ADVAPI32 dll
77Е14000 Free 49152
77E20000 Image 401408 4 ERWC C:\WINNT\system32\USER32 dll
77Е82000 Free 57344
77Е90000 Image 720896 5 ERWC С \WINNT\system32\KERNEL32.dll
77F40000 Image 241664 4 ERWC С \WINKT\system32\GUI32 DLL
77F7В000 Free 20480
77FB0000 image 483328 5 ERWC С \WINNT\System32\ntdll.dll
77FF000 Free 40960
78000000 Image 290816 6 bMWC С \WINNT\system32\MSVCRI.dll
78047000 Free 124424192
7F6F0000 Mapped 1048576 2 ER--
7F7F0000 Free 8126464
7FFB0000 Mapped 147456 1 -R--
7FFD4000 Free 40960
7FFDE000 Private 4096 1 ERW-
7FFDF000 Private 4096 1 ERW-
7FFE0000 Private 65536 2 -R--

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