logo
АВМиС - бывшее АПЭВМ / apvem / всякаявсячина

58. Проецируемые в память файлы

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

Проецируемые файлы применяются для:

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

• доступа к файлу данных, размещенному на диске. Это позволяет обойтись без операций файлового ввода/вывода и буферизации его содержимого;

• разделения данных между несколькими процессами, выполняемыми на одной машине.

1. Отыскивает ЕХЕ-файл, указанный при вызове CreateProcess. Если файл не найден, новый процесс не создается, а функция возвращает NULL.

2. Создает новый объект ядра “процесс”.

3. Создает адресное пространство нового процесса (размером 4 Гб).

  1. Резервирует регион адресного пространства — такой, чтобы в него поместился заданный ЕХЕ-файл. Желательное расположение этого региона указывается внут­ри самого ЕХЕ-файла. По умолчанию базовый адрес ЕХЕ-файла — 0x00400000.

  2. Отмечает, что физическая память, увязанная с зарезервированным регионом, — ЕХЕ-файл на диске, а не страничный файл.

Спроецировав ЕХЕ-файл на адресное пространство процесса, система обращается к разделу ЕХЕ-файла со списком DLL-модулей, содержащих необходимые программе функции. После этого система поочередно загружает DLL-модули. Всякий раз, когда для заг­рузки DLL вызывается LoadLibrary, система выполняет действия, аналогичные описан­ным выше в пп. 4 и 5:

1. Резервирует регион адресного пространства — такой, чтобы в него мог помес­титься заданный DLL-файл. Желательное расположение этого региона указыва­ется внутри самого DLL-файла. По умолчанию DLL-модулям присваивается базовый адрес 0x10000000.

2. Если зарезервировать регион по желательному для DLL базовому адресу не удается (либо он слишком мал, либо занят каким-то еще ЕХЕ- или DLL-файлом), система пытается найти другой регион. Но такая ситуация весьма не­приятна. Во-первых, если в DLL нет настроечной информации, загрузка может вообще не получиться. Во-вторых, системе приходится выполнять модификацию адресов (relocation) внутри DLL. В Windows 95 эта операция осуществляется по мере подкачки страниц в оперативную память. Но в Windows NT на это уходит дополнительная физичес­кая память, выделяемая из страничного файла, да и загрузка такого DLL-модуля займет больше времени.

3. Отмечает, что физическая память, связанная с зарезервированным регионом, — DLL-файл на диске, а не страничный файл. Если Windows NT пришлось выпол­нять модификацию адресов из-за того, что DLL не удалось загрузить по желатель­ному базовому адресу, она запоминает, что часть физической памяти для DLL связана со страничным файлом.

После увязки ЕХЕ- и DLL-файлов с адресным пространством процесса начинает ис­полняться стартовый код ЕХЕ-файла