Función MmAllocateContiguousMemorySpecifyCache (wdm.h)
La rutina MmAllocateContiguousMemorySpecifyCache asigna un intervalo de memoria física contigua y no paginada y la asigna al espacio de direcciones del sistema.
Sintaxis
PVOID MmAllocateContiguousMemorySpecifyCache(
[in] SIZE_T NumberOfBytes,
[in] PHYSICAL_ADDRESS LowestAcceptableAddress,
[in] PHYSICAL_ADDRESS HighestAcceptableAddress,
[in, optional] PHYSICAL_ADDRESS BoundaryAddressMultiple,
[in] MEMORY_CACHING_TYPE CacheType
);
Parámetros
[in] NumberOfBytes
Tamaño, en bytes, del bloque de memoria contigua que se va a asignar. Para obtener más información, vea la sección Comentarios.
[in] LowestAcceptableAddress
La dirección física más baja válida que puede usar el autor de la llamada. Por ejemplo, si un dispositivo solo puede abordar ubicaciones por encima de los primeros 8 megabytes del intervalo de direcciones de memoria física del procesador, el controlador de este dispositivo debe establecer LowestAcceptableAddress en 0x0000000000800000.
[in] HighestAcceptableAddress
La dirección física válida más alta que puede usar el autor de la llamada. Por ejemplo, si un dispositivo solo puede abordar ubicaciones en los primeros 16 megabytes del intervalo de direcciones de memoria física del procesador, el controlador de este dispositivo debe establecer HighestAcceptableAddress en 0x0000000000FFFFFF.
[in, optional] BoundaryAddressMultiple
Dirección física múltiple que el búfer asignado no debe cruzar. Una dirección física múltiple siempre debe ser una potencia de dos. Este parámetro es opcional y se puede especificar como cero para indicar que el dispositivo no tiene restricciones de límites de memoria especiales. Para obtener más información, vea la sección Comentarios.
[in] CacheType
Especifica un valor de MEMORY_CACHING_TYPE , que indica el tipo de almacenamiento en caché permitido para la memoria solicitada.
Valor devuelto
MmAllocateContiguousMemorySpecifyCache devuelve la dirección virtual base para la memoria asignada. Si el sistema no puede asignar el búfer solicitado, la rutina devuelve NULL.
Comentarios
MmAllocateContiguousMemorySpecifyCache asigna un bloque de memoria no paginada que es contiguo en el espacio de direcciones físicos. La rutina asigna este bloque a un bloque contiguo de memoria virtual en el espacio de direcciones del sistema y devuelve la dirección virtual de la base de este bloque. La rutina alinea la dirección inicial de una asignación de memoria contigua a un límite de página de memoria.
Los controladores no deben tener acceso a la memoria más allá del tamaño de asignación solicitado. Por ejemplo, los desarrolladores no deben suponer que sus controladores pueden usar memoria de forma segura entre el final de su asignación solicitada y el límite de la página siguiente.
Dado que la memoria física contigua suele estar en breve suministro, debe usarse con moderación y solo cuando sea necesario. Un controlador que debe usar memoria contigua debe asignar esta memoria durante la inicialización del controlador, ya que es probable que la memoria física se fragmente con el tiempo a medida que el sistema operativo asigna y libera memoria. Normalmente, un controlador llama a MmAllocateContiguousMemorySpecifyCache desde su rutina DriverEntry para asignar un búfer interno para el uso a largo plazo y libera el búfer justo antes de descargar el controlador.
La memoria asignada por MmAllocateContiguousMemorySpecifyCache debe liberarse cuando la memoria ya no sea necesaria. Llame a la rutina MmFreeContiguousMemory para liberar memoria asignada por MmAllocateContiguousMemorySpecifyCache.
Si especifica un valor distinto de cero para el parámetro BoundaryAddressMultiple , el intervalo de direcciones físicos del bloque de memoria asignado no cruzará un límite de dirección que sea un entero múltiplo de este valor. Un controlador debe establecer este parámetro en cero a menos que se requiera un valor distinto de cero para solucionar una limitación de hardware. Por ejemplo, si un dispositivo no puede transferir datos a través de límites físicos de 16 megabytes, el controlador debe especificar un valor de 0x1000000 para este parámetro para asegurarse de que las direcciones que ve el dispositivo no se ajustan en un límite de 16 megabytes.
Si usa la rutina MmAllocateContiguousMemorySpecifyCache en equipos con grandes cantidades de memoria, el rendimiento del sistema operativo podría degradarse gravemente cuando el sistema intenta crear un fragmento de memoria contiguo. Esta degradación se reduce considerablemente a partir de Windows Vista SP1 y Windows Server 2008, pero la memoria contigua todavía puede ser costosa de asignar. Por este motivo, los controladores deben evitar llamadas repetidas a MmAllocateContiguousMemorySpecifyCache. En su lugar, los controladores deben asignar todos los búferes contiguos necesarios en sus rutinas driverEntry y reutilizar estos búferes.
La memoria que MmAllocateContiguousMemorySpecifyCache asigna no está inicializada. Un controlador en modo kernel debe cero primero esta memoria si va a hacer que sea visible para el software en modo de usuario (para evitar la pérdida de contenido potencialmente con privilegios).
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Universal |
Encabezado | wdm.h (incluya Wdm.h, Ntddk.h) |
Library | NtosKrnl.lib |
Archivo DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |