Compartir a través de


Función MmAllocateContiguousMemory (wdm.h)

La rutina MmAllocateContiguousMemory asigna un intervalo de memoria física contigua y no paginada y la asigna al espacio de direcciones del sistema.

Sintaxis

PVOID MmAllocateContiguousMemory(
  [in] SIZE_T           NumberOfBytes,
  [in] PHYSICAL_ADDRESS HighestAcceptableAddress
);

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] 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. Si no tiene requisitos específicos para la asignación de memoria, establezca en MAXULONG64.

Valor devuelto

MmAllocateContiguousMemory devuelve la dirección virtual base para la memoria asignada. Si no se puede satisfacer la solicitud, la rutina devuelve NULL.

Comentarios

MmAllocateContiguousMemory 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 MmAllocateContiguousMemory 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 MmAllocateContiguousMemory debe liberarse cuando la memoria ya no sea necesaria. Llame a la rutina MmFreeContiguousMemory para liberar memoria asignada por MmAllocateContiguousMemory.

Cuando la memoria física se fragmenta en un equipo que tiene una gran cantidad de RAM, las llamadas a MmAllocateContiguousMemory, que requieren que el sistema operativo busque bloques contiguos de memoria, puede degradar gravemente el rendimiento. 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 MmAllocateContiguousMemory. 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 MmAllocateContiguousMemory asigna no está inicializada. Un controlador en modo kernel debe establecer primero esta memoria en cero si va a hacer que sea visible para el software en modo de usuario (para evitar fugas 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 IRQL <= DISPATCH_LEVEL

Consulte también

AllocateCommonBuffer

DriverEntry

MmAllocateContiguousMemorySpecifyCache

MmAllocateNonCachedMemory

MmFreeContiguousMemory