logo
ZH ос 20 вопр 36 стр

5. Файлы, проецируемые в память.

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

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

  1. Загрузки и исполнения ехе и dll файлов. Это позволяет экономить на размере страничного файла и на времени, необходимом ОС для подготовки приложения к исполнению.

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

  3. Для совместного доступа к данным, принадлежащим нескольким процессам.

Рассмотрим механизм проецирования файлов.

1.Создать или открыть объект ядра файл, идентифицирующий файл на диске. Этот файл будет использоваться для проецирования в память. ОС должна хранить данные о рабочих ресурсах. Kernel32 создаёт системную кучу. В этой куче создаются структуры, описывающие все ресурсы системы.

CreateFile(…). Используется как для создания новых, так и для открытия существующих файлов. Результатом работы является дескриптор файла.

таблица дескрипторов база данных файла

0

Виртуальный адрес объекта

.

.

.

5

указатель на объект ядра

Чтобы получить реальный адрес, надо побитно обработать виртуальный адрес с помощью оператора XOR.

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

2. Создание объекта ядра проецируемый файл, чтобы сообщить системе размер файла и способ доступа к нему.

C reateFile(…)

CreateFileMapping(…) – создания объекта ядра проецируемый файл. Результатом выполнения является дескриптор объекта ядра проецируемый файл.

3.Выделение региона адресного пространства процесса и проецирование на этот регион файла. Другими словами выделение физической памяти региону.

MapViewOfFile(…). Входными данными для этой функции является дескриптор объекта ядра проецируемый файл, полученный в пункте 2. Результатом выполнения этой функции является витуальный адрес региона.

4.p^[0]:=’a’;

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

5.Сообщить системе об отмене проецирования на адресное пространство процесса объекта ядра проецируемый файл. Выполняется это с помощью функции UnMapViewOfFile(…). Результатом является адрес региона адресного пространства, на который спроецирован файл, то есть адрес, полученный в пункте 3.

6.Закрыть объект ядра файл проецируемый в память.

CloseHandle(…). Параметром является дескриптор в пункте 2.

7.Закрыть объект ядра файл.

CloseHandle(…).

В случае, если не выпонены 6 и 7 в системной куче kernel32 будет содержаться информация о несуществующих объектах.

Проецирование в память exe и dll файлов.

Чтобы запустить ехе файл CreateProcess(…), где имя файла – это один из параметров.

  1. Отыскивается ехе файл, вызванный функцией.

  2. Создаётся объект ядра процесс.

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

  4. Выполнение проецируемого файла на адресное пространство процесса. В самом ехе файле указы-вается регион адресного пространства, в которое спроецирован файл.

  5. Отмечается, что физическая память, связанная с выделенным регионом – это файл на диске, а не страничный файл.

  6. Спроецировав ехе файл ОС читает несколько первых страниц в файл, чтобы получить список dll, необходимых данному ехе файлу. Затем ОС с помощью функции LoadLibrary(…) поочерёдно загружает указанные dll в адресное пространство процесса. Точно также выделяется регион в адресном пространстве и на него проецируется dll. Начальный адрес региона адресного простраства, на который желательно спроецировать dll указывается компоновщиком при создании dll. У всех системных dll (kernel32.dll и user32.dll).

  7. После увязки ехе и dll файлов с адресным пространством процесса начинает выполняться стартовый код ехе файла. Подкачку страниц берёт на себя ОС.