Функция VirtualAlloc2FromApp (memoryapi.h)
Резервирует, фиксирует или изменяет состояние региона страниц в виртуальном адресном пространстве вызывающего процесса. Память, выделенная этой функцией, автоматически инициализирована до нуля.
С помощью этой функции можно: для новых выделений указать диапазон виртуального адресного пространства и ограничение выравнивания 2; укажите произвольное число расширенных параметров; укажите предпочтительный узел NUMA для физической памяти в качестве расширенного параметра; и укажите операцию заполнителя (в частности, замену).
Чтобы указать узел NUMA, см. параметр
Синтаксис
PVOID VirtualAlloc2FromApp(
[in, optional] HANDLE Process,
[in, optional] PVOID BaseAddress,
[in] SIZE_T Size,
[in] ULONG AllocationType,
[in] ULONG PageProtection,
[in, out, optional] MEM_EXTENDED_PARAMETER *ExtendedParameters,
[in] ULONG ParameterCount
);
Параметры
[in, optional] Process
Дескриптор процесса. Функция выделяет память в виртуальном адресном пространстве этого процесса.
Дескриптор должен иметь право PROCESS_VM_OPERATION доступа. Дополнительные сведения см. в "Безопасность процессов и доступ".
[in, optional] BaseAddress
Указатель, указывающий нужный начальный адрес для области страниц, которую нужно выделить.
Если BaseAddressNULL, функция определяет, где выделить регион.
Если BaseAddress не NULL, то любая указанная MEM_ADDRESS_REQUIREMENTS структура должна состоять из всех нулей, а базовый адрес должен быть нескольким из детализации распределения системы. Чтобы определить степень детализации выделения, используйте функцию GetSystemInfo.
[in] Size
Размер выделенной области памяти в байтах.
Размер всегда должен быть кратным размером страницы.
Если
[in] AllocationType
Тип выделения памяти. Этот параметр должен содержать одно из следующих значений.
Ценность | Значение |
---|---|
|
Выделяет расходы на память (от общего размера памяти и файлов разбиения по страницам на диске) для указанных зарезервированных страниц памяти. Функция также гарантирует, что, когда вызывающий объект позже обращается к памяти, содержимое будет равно нулю. Фактические физические страницы не выделяются, если только не будут доступны виртуальные адреса.
Чтобы зарезервировать и зафиксировать страницы на одном шаге, вызовите Virtual2AllocFromApp с Попытка зафиксировать определенный диапазон адресов путем указания MEM_COMMIT без MEM_RESERVE и неNULLBaseAddress, если только весь диапазон уже не зарезервирован. Полученный код ошибки ERROR_INVALID_ADDRESS. Попытка зафиксировать страницу, которая уже зафиксирована, не приводит к сбою функции. Это означает, что страницы можно зафиксировать, не определяя текущее состояние обязательств каждой страницы. |
|
Резервирует диапазон виртуального адресного пространства процесса без выделения фактического физического хранилища в памяти или в файле разбиения на диск.
Зарезервированные страницы можно зафиксировать в последующих вызовах функции Virtual2AllocFromApp. Чтобы зарезервировать и зафиксировать страницы на одном шаге, вызовите Virtual2AllocFromApp с MEM_COMMIT | MEM_RESERVE. Другие функции выделения памяти, такие как malloc и LocalAlloc, не могут использовать зарезервированный диапазон памяти, пока он не будет освобожден. |
|
Заменяет заполнитель обычным частным выделением. Поддерживаются только представления разделов с поддержкой данных и pf (изображения, физическая память и т. д.). При замене заполнителя BaseAddress и Size должны точно соответствовать заполнителю, а любая указанная MEM_ADDRESS_REQUIREMENTS структура должна состоять из всех нулей.
После замены заполнителя частным выделением, чтобы освободить это выделение обратно в заполнитель, см. параметр dwFreeTypeVirtualFree и VirtualFreeEx. Заполнитель — это тип зарезервированной области памяти. |
|
Чтобы создать заполнитель, вызовите VirtualAlloc2 с MEM_RESERVE | MEM_RESERVE_PLACEHOLDER и PageProtection для PAGE_NOACCESS. Сведения о том, как освободить или разделить или разделить заполнитель, см. в параметре dwFreeTypeVirtualFree и VirtualFreeEx.
Заполнитель — это тип зарезервированной области памяти. |
|
Указывает, что данные в диапазоне памяти, заданном BaseAddress и Size больше не являются интересом. Страницы не должны быть считываются или записываются в файл разбиения на страницы. Однако блок памяти будет использоваться снова позже, поэтому его не следует выводить. Это значение нельзя использовать с любым другим значением.
Использование этого значения не гарантирует, что диапазон, на котором работает MEM_RESET, будет содержать нули. Если вы хотите, чтобы диапазон содержал нули, удалите память, а затем снова зафиксируете его. При указании Virtual2AllocFromApp возвращает ошибку, если используется MEM_RESET, а диапазон памяти сопоставляется с файлом. Общее представление допускается только в том случае, если оно сопоставлено с файлом разбиения на страницы. |
|
MEM_RESET_UNDO следует вызывать только в диапазоне адресов, к которому MEM_RESET успешно применено ранее. Он указывает, что данные в указанном диапазоне памяти, указанные BaseAddress и Size, заинтересованы в вызове и пытается отменить эффекты MEM_RESET. Если функция выполнена успешно, это означает, что все данные в указанном диапазоне адресов не сохраняются. Если функция завершается ошибкой, по крайней мере некоторые данные в диапазоне адресов заменены нулями.
Это значение нельзя использовать с любым другим значением. Если MEM_RESET_UNDO вызывается в диапазоне адресов, который не был MEM_RESET ранее, поведение не определено. При указании |
Этот параметр также может указать следующие значения, как указано.
Ценность | Значение |
---|---|
|
Выделяет память с помощью поддержки больших страниц.
Размер и выравнивание должны быть несколькими из минимума больших страниц. Чтобы получить это значение, используйте функцию GetLargePageMinimum Если указать это значение, необходимо также указать MEM_RESERVE и MEM_COMMIT. |
|
Резервирует диапазон адресов, который можно использовать для сопоставления страницы расширений окна адресов (AWE).
Это значение должно использоваться с MEM_RESERVE и никакими другими значениями. |
|
Выделяет память по максимально возможному адресу. Это может быть медленнее регулярных выделений, особенно при наличии большого количества выделений. |
|
Система отслеживает страницы, записанные в выделенный регион. Если указать это значение, необходимо также указать MEM_RESERVE.
Чтобы получить адреса страниц, записанных с момента выделения региона или состояния отслеживания записи, вызовите функцию GetWriteWatch. Чтобы сбросить состояние отслеживания записи, вызовите GetWriteWatch или ResetWriteWatch. Функция отслеживания записи остается включенной для региона памяти, пока регион не будет освобожден. |
[in] PageProtection
Защита памяти для выделенной области страниц. Если страницы фиксируются, можно указать одну из констант защиты памяти . Следующие константы вызывают ошибку:
- PAGE_EXECUTE
- PAGE_EXECUTE_READ
- PAGE_EXECUTE_READWRITE
- PAGE_EXECUTE_WRITECOPY
[in, out, optional] ExtendedParameters
Необязательный указатель на один или несколько расширенных параметров типа MEM_EXTENDED_PARAMETER. Каждое из этих расширенных значений параметров может иметь поле типа
[in] ParameterCount
Число расширенных параметров, на которые указывает ExtendedParameters.
Возвращаемое значение
Если функция выполнена успешно, возвращаемое значение является базовым адресом выделенного региона страниц.
Если функция завершается ошибкой, возвращаемое значение равно NULL. Чтобы получить расширенные сведения об ошибке, вызовите GetLastError.
Замечания
Этот API помогает поддерживать высокопроизводительные игры и серверные приложения, которые имеют определенные требования к управлению виртуальным адресным пространством. Например, сопоставление памяти на вершине ранее зарезервированного региона; это полезно для реализации автоматического буфера круговой оболочки. Выделение памяти с определенным выравниванием; Например, чтобы приложение зафиксировать крупные или огромные области, сопоставленные со страницами по требованию.
Вы можете вызывать Virtual2AllocFromApp из приложений Магазина Windows с возможностями JIT для использования функций JIT. Приложение должно включать возможности codeGeneration в файл манифеста приложения для использования возможностей JIT.
Каждая страница имеет связанное состояние страницы. Функция Virtual2AllocFromApp может выполнять следующие операции:
- Фиксация области зарезервированных страниц
- Зарезервировать область бесплатных страниц
- Одновременно зарезервируйте и зафиксируйте область бесплатных страниц
Вы можете использовать Virtual2AllocFromApp для резервирования блока страниц и последующего вызова Virtual2AllocFromApp для фиксации отдельных страниц из зарезервированного блока. Это позволяет процессу резервировать диапазон своего виртуального адресного пространства без использования физического хранилища до тех пор, пока он не потребуется.
Если параметр baseAddress
Virtual2AllocFromApp не позволяет создавать исполняемые страницы.
Функцию Virtual2AllocFromApp можно использовать для резервирования расширения окна адресов (AWE) в пределах виртуального адресного пространства указанного процесса. Затем этот регион памяти можно использовать для сопоставления физических страниц с виртуальной памятью и из нее, как это требуется приложению. Значения
Функция VirtualFree может отключить зафиксированную страницу, освободить хранилище страницы или одновременно выпустить зафиксированную страницу. Он также может освободить зарезервированную страницу, что делает ее бесплатной.
При создании региона, который будет исполняемым, вызывающая программа несет ответственность за обеспечение совместного использования кэша с помощью соответствующего вызова FlushInstructionCache после установки кода. В противном случае попытки выполнить код из только что исполняемого региона могут привести к непредсказуемым результатам.
Примеры
Примеры кода см. в Virtual2Alloc.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows 10 [только классические приложения] |
минимальный поддерживаемый сервер | Windows Server 2016 [только классические приложения] |
целевая платформа | Виндоус |
заголовка | memoryapi.h (включая Windows.h) |
библиотеки |
WindowsApp.lib |
DLL | Kernel32.dll |