Поделиться через


Функция MapViewOfFileExNuma (winbase.h)

Сопоставляет представление сопоставления файлов с адресным пространством вызывающего процесса и задает узел NUMA для физической памяти.

Синтаксис

LPVOID MapViewOfFileExNuma(
  [in]           HANDLE hFileMappingObject,
  [in]           DWORD  dwDesiredAccess,
  [in]           DWORD  dwFileOffsetHigh,
  [in]           DWORD  dwFileOffsetLow,
  [in]           SIZE_T dwNumberOfBytesToMap,
  [in, optional] LPVOID lpBaseAddress,
  [in]           DWORD  nndPreferred
);

Параметры

[in] hFileMappingObject

Дескриптор для объекта сопоставления файлов. Функции CreateFileMappingNuma и OpenFileMapping возвращают этот дескриптор.

[in] dwDesiredAccess

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

Значение Значение
FILE_MAP_ALL_ACCESS
Сопоставляется представление файла для чтения и записи. Объект сопоставления файлов должен быть создан с защитой PAGE_READWRITE или PAGE_EXECUTE_READWRITE .

При использовании с MapViewOfFileExNumaFILE_MAP_ALL_ACCESS эквивалентна FILE_MAP_WRITE.

FILE_MAP_READ
Сопоставляется доступное только для чтения представление файла. Попытка записи в представление файлов приводит к нарушению доступа.

Объект сопоставления файлов должен быть создан с защитой PAGE_READONLY, PAGE_READWRITE, PAGE_EXECUTE_READ или PAGE_EXECUTE_READWRITE .

FILE_MAP_WRITE
Сопоставляется представление файла для чтения и записи. Объект сопоставления файлов должен быть создан с защитой PAGE_READWRITE или PAGE_EXECUTE_READWRITE .

При использовании с MapViewOfFileExNuma(FILE_MAP_WRITE | FILE_MAP_READ) эквивалентно FILE_MAP_WRITE.

 

С помощью побитового ИЛИ можно объединить приведенные выше значения с этими значениями.

Значение Значение
FILE_MAP_COPY
Сопоставляется представление копирования при записи файла. Объект сопоставления файлов должен быть создан с защитой PAGE_READONLY, PAGE_READ_EXECUTE, PAGE_WRITECOPY, PAGE_EXECUTE_WRITECOPY, PAGE_READWRITE или PAGE_EXECUTE_READWRITE .

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

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

FILE_MAP_EXECUTE
Сопоставляется исполняемое представление файла (сопоставленная память может выполняться как код). Объект сопоставления файлов должен быть создан с защитой PAGE_EXECUTE_READ, PAGE_EXECUTE_WRITECOPY или PAGE_EXECUTE_READWRITE .
FILE_MAP_LARGE_PAGES
Начиная с Windows 10 версии 1703, этот флаг указывает, что представление должно быть сопоставлено с помощью поддержки больших страниц. Размер представления должен быть кратным размеру большой страницы, сообщаемой функцией GetLargePageMinimum , а объект сопоставления файлов должен быть создан с помощью параметра SEC_LARGE_PAGES . Если для lpBaseAddress указано значение, отличное от NULL, значение должно быть кратным GetLargePageMinimum.
FILE_MAP_TARGETS_INVALID
Устанавливает все расположения в сопоставленном файле как недопустимые целевые объекты для защиты потока управления (CFG). Этот флаг похож на PAGE_TARGETS_INVALID. Используйте этот флаг в сочетании с FILE_MAP_EXECUTE права доступа на выполнение. Любой непрямый вызов расположений на этих страницах завершится проверкой CFG, и процесс будет завершен. По умолчанию для выделенных исполняемых страниц помечается допустимые целевые объекты вызова для CFG.
 

Для объектов сопоставления файлов, созданных с помощью атрибута SEC_IMAGE, параметр dwDesiredAccess не действует и должен иметь любое допустимое значение, например FILE_MAP_READ.

Дополнительные сведения о доступе к объектам сопоставления файлов см. в разделе Безопасность сопоставления файлов и права доступа.

[in] dwFileOffsetHigh

DWORD в высоком порядке смещения файла, с которого начинается представление.

[in] dwFileOffsetLow

DWORD нижнего порядка смещения файла, с которого начинается представление. Сочетание высоких и низких смещений должно указывать смещение в сопоставлении файлов. Они также должны соответствовать степени детализации выделения памяти в системе. То есть смещение должно быть кратно степени детализации выделения. Чтобы получить степень детализации выделения памяти в системе, используйте функцию GetSystemInfo , которая заполняет элементы структуры SYSTEM_INFO .

[in] dwNumberOfBytesToMap

Число байтов сопоставления файлов для сопоставления с представлением. Все байты должны быть в пределах максимального размера, заданного параметром CreateFileMapping. Если этот параметр равен 0 (ноль), сопоставление распространяется от указанного смещения до конца сопоставления файлов.

[in, optional] lpBaseAddress

Указатель на адрес памяти в адресном пространстве вызывающего процесса, где начинается сопоставление. Это должно быть кратно степени детализации выделения памяти в системе, иначе функция завершается ошибкой. Чтобы определить степень детализации выделения памяти в системе, используйте функцию GetSystemInfo . Если по указанному адресу недостаточно адресного пространства, функция завершается сбоем.

Если параметр lpBaseAddress имеет значение NULL, операционная система выбирает адрес сопоставления.

Хотя можно указать безопасный адрес (не используемый операционной системой), нет никакой гарантии, что адрес будет оставаться безопасным с течением времени. Поэтому лучше позволить операционной системе выбрать адрес. В этом случае указатели не будут храниться в сопоставленном файле памяти; Вы будете хранить смещения от базы сопоставления файлов, чтобы сопоставление можно было использовать по любому адресу.

[in] nndPreferred

Узел NUMA, на котором должна находиться физическая память.

Значение Значение
NUMA_NO_PREFERRED_NODE
0xffffffff
Не рекомендуется использовать узел NUMA. Это то же самое, что вызов функции MapViewOfFileEx .

Возвращаемое значение

Если функция выполняется успешно, возвращаемое значение является начальным адресом сопоставленного представления.

Если функция завершается сбоем, возвращается значение NULL. Чтобы получить расширенные сведения об ошибке, вызовите функцию GetLastError .

Комментарии

Сопоставление файла делает указанную часть файла видимой в адресном пространстве вызывающего процесса.

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

Чтобы получить размер представления, используйте функцию VirtualQueryEx .

Начальное содержимое страниц в объекте сопоставления файлов, поддерживаемом файлом подкачки, равно 0 (ноль).

Если указан предлагаемый адрес сопоставления, файл сопоставляется по указанному адресу (округляется до ближайшей границы 64 КБ), если на указанном адресе достаточно адресного пространства. Если адресного пространства недостаточно, функция завершается сбоем.

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

Если параметр lpBaseAddress указывает базовое смещение, функция выполняется успешно, если указанная область памяти еще не используется вызывающим процессом. Система не гарантирует, что та же область памяти доступна для сопоставленного файла памяти в других 32-разрядных процессах.

Несколько представлений файла (или объекта сопоставления файлов и сопоставленного файла) являются согласованными , если они содержат идентичные данные в указанное время. Это происходит, если представления файлов являются производными от одного объекта сопоставления файлов. Процесс может дублировать дескриптор объекта сопоставления файлов в другой процесс с помощью функции DuplicateHandle , или другой процесс может открыть объект сопоставления файлов по имени с помощью функции OpenFileMapping .

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

Исключение связано с удаленными файлами. Хотя MapViewOfFileExNuma работает с удаленными файлами, она не поддерживает их согласованность. Например, если два компьютера сопоставляют файл как доступный для записи и изменяют одну и ту же страницу, каждый компьютер видит только собственные записи на страницу. При обновлении данных на диске они не объединяются.

Сопоставленное представление файла не гарантирует согласованность с файлом, к которым осуществляется доступ с помощью функции ReadFile или WriteFile .

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

При изменении файла с помощью сопоставленного представления метка времени последнего изменения может не обновляться автоматически. При необходимости вызывающий объект должен использовать SetFileTime для установки метки времени.

Чтобы получить файл с разрешениями на исполняемый файл, приложение должно вызвать функцию CreateFileMappingNuma с PAGE_EXECUTE_READWRITE или PAGE_EXECUTE_READ , а затем вызвать функцию MapViewOfFileExNuma с FILE_MAP_EXECUTE | FILE_MAP_WRITE или FILE_MAP_EXECUTE | FILE_MAP_READ.

В Windows Server 2012 эта функция поддерживается следующими технологиями.

Технология Поддерживается
Протокол SMB 3.0 Да
Прозрачная отработка отказа (TFO) SMB 3.0 Да
SMB 3.0 с масштабируемыми общими папками (SO) Да
Файловая система общего тома кластера (CSVFS) Да
Восстанавливаемая файловая система (ReFS) Да

Требования

Требование Значение
Минимальная версия клиента Windows Vista [только классические приложения]
Минимальная версия сервера Windows Server 2008 [только классические приложения]
Целевая платформа Windows
Header winbase.h (включая Windows.h)
Библиотека Kernel32.lib
DLL Kernel32.dll

См. также

CreateFileMappingNuma

DuplicateHandle

Функции сопоставления файлов

GetSystemInfo

MapViewOfFileEx

Поддержка NUMA

OpenFileMapping

ReadFile

SYSTEM_INFO

UnmapViewOfFile

VirtualAlloc

WriteFile