46079 (665371), страница 2
Текст из файла (страница 2)
Когда 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












