? Загрузка .exe и .DLL модулей;
? Операции ввода/вывода;
? Разделение данных между процессами.
Загрузка .exe и .DLL модулей:
1. Создание проекции .exe(.DLL) модулей в памяти;
2. Прочитывается из нее заголовок (на основе нее создается проекция);
3. Создается процесс;
4. Загрузка библиотек (.DLL) связанных с процессом;
5. Создается первичный поток.
Несколько экземпляров .exe модулей разделяют один и тот же участок физической памяти. При попытке записи в (одну и туже область) общую область, (создается) генерируется исключение, которое создает копию страницы и передает ее записывающему процессу (экономичное расходование памяти).
Операции ввода/вывода:
Позволяют не применять функции чтения и записи файловой системы, а заменить их на обычные операции с памятью, возложив работу по переносу на ОС. Непосредственная запись будет произведена в момент непосредственной выгрузки страницы.
Разделение данных между процессами:
Один процесс создает проецируемый в память файл, другой – открывает. Поскольку проецируемый файл является файлом, что позволяет приложениям обмениваться через него данными.
1. Создать или открыть объект ядра файл:
HANDLE CreateFile (
LPSTR NameFile, // имя файла
DWORD DesiredAccess, // режем доступа к файлу
DWORD SharedMode, // режим разделения файла
LPSECURITI_ATTRIBUTES SA, // атрибуты безопасности (NULL)
DWORD CreationDispsition, // как создать файл (0)
DWORD FlagsAttributes, (0)
HANDLE TemplateFile); // файл шаблона (NULL)
Режим доступа (DesiredAccess):
0 – получение атрибутов
GENERIC_READ – только чтение
GENERIC_WRITE – только запись
(GENERIC_READ | GENERIC_WRITE) – чтение и запись (объединение по «ИЛИ»)
Режим разделения файлов (SharedMode):
0 — монопольно
FILE_SHARE_READ – повторное открытие по чтению
FILE_SHARE_WRITE – повторное открытие по записи
(в случае ошибки возвращает INVALID_HANDLE_VALUE)
2. Создать объект ядра – «проекция файла»
HANDLE CreateFileMapping (
HANDLE File, // описатель открытого файла
LPSECURITI_ATTRIBUTES SA, // атрибуты безопасности (NULL)
DWORD Protect, // флаг
DWORD MaxSizeH, // размер файла в байтах (старшая часть — резерв)
DWORD MaxSizeL // размер файла в байтах (младшая часть)
LPSTR Name); // синоним (объекта)
MaxSizeH = MaxSizeL = 0 (размер файла по умолчанию).
Если размер файла меньше MaxSize, то память выделяется до MaxSize по мере записи.
3. Спроецировать файл на адресное пространство процессора:
LPVOID MappViewOfFile (
HANDLE FileMapping, // описатель объекта «проекция файла»
DWORD DesiredAccess, // доступ
DWORD FileOffsetH, // позиция с какого места отображать файл в памяти
DWORD FileOffsetL, // позиция с какого места отображать файл в памяти
DWORD NumberOfBytesToMap); // сколько байт отобразить
Режим доступа (DesiredAccess):
FILE_MAP_READ – полный доступ
FILE_MAP_WRITE – доступ по записи
FILE_MAP_COPY – создание закрытой копии при записи
4. Уничтожить объект (освобождение региона)
BOOL UnmapViewOfFile (
LPVOID Addr); // объект ядра
5. Закрыть проекцию файл:
BOOL CloseFile (
HANDLE FileMapping); // описатель объекта «проекция файла»
6. Закрыть файл:
BOOL CloseHandle (HANDLE h);
Замечание: Если требуется разделение данных между несколькими процессами, то вместо функции CreateFileMapping может использоваться OpenFileMapping:
HANDLE OpenFileMapping (
DWORD DesiredAccess, // доступ
BOOL InheritHandle, // наследование описателя
LPSTR Name); // синоним объекта для открытия
Проецируемые в память файлы
05 Мар, 2009
