Função MmAllocateContiguousMemory (ntddk.h)

A rotina MmAllocateContiguousMemory aloca um intervalo de memória física contígua e nãopagada e a mapeia para o espaço de endereço do sistema.

Sintaxe

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

Parâmetros

[in] NumberOfBytes

O tamanho, em bytes, do bloco de memória contígua a ser alocado. Para obter mais informações, consulte Comentários.

[in] HighestAcceptableAddress

O endereço físico mais alto válido que o chamador pode usar. Por exemplo, se um dispositivo puder abordar apenas locais nos primeiros 16 megabytes do intervalo de endereços de memória física do processador, o driver deste dispositivo deverá definir HighestAcceptableAddress como 0x0000000000FFFFFF.

Retornar valor

MmAllocateContiguousMemory retorna o endereço virtual base para a memória alocada. Se a solicitação não puder ser atendida, a rotina retornará NULL.

Comentários

MmAllocateContiguousMemory aloca um bloco de memória nãopagada contíguo no espaço de endereço físico. A rotina mapeia esse bloco para um bloco contíguo de memória virtual no espaço de endereço do sistema e retorna o endereço virtual da base desse bloco. A rotina alinha o endereço inicial de uma alocação de memória contígua a um limite de página de memória.

Os drivers não devem acessar a memória além do tamanho de alocação solicitado. Por exemplo, os desenvolvedores não devem assumir que seus drivers podem usar a memória com segurança entre o final da alocação solicitada e o limite da próxima página.

Como a memória física contígua geralmente está em falta, ela deve ser usada com moderação e somente quando necessário. Um driver que deve usar memória contígua deve alocar essa memória durante a inicialização do driver porque a memória física provavelmente ficará fragmentada ao longo do tempo à medida que o sistema operacional aloca e libera memória. Normalmente, um driver chama MmAllocateContiguousMemory de sua rotina DriverEntry para alocar um buffer interno para uso de longo prazo e libera o buffer pouco antes de o driver ser descarregado.

A memória alocada por MmAllocateContiguousMemory deve ser liberada quando a memória não é mais necessária. Chame a rotina MmFreeContiguousMemory para liberar memória alocada por MmAllocateContiguousMemory.

Quando a memória física é fragmentada em um computador que tem uma grande quantidade de RAM, as chamadas para MmAllocateContiguousMemory, que exigem que o sistema operacional pesquise blocos contíguos de memória, podem prejudicar severamente o desempenho. Essa degradação é muito reduzida a partir do Windows Vista SP1 e do Windows Server 2008, mas a memória contígua ainda pode ser cara de alocar. Por esse motivo, os drivers devem evitar chamadas repetidas para MmAllocateContiguousMemory. Em vez disso, os drivers devem alocar todos os buffers contíguos necessários em suas rotinas driverEntry e reutilizar esses buffers.

A memória alocada por MmAllocateContiguousMemory não é inicializada. Um driver de modo kernel deve primeiro definir essa memória como zero se ele vai torná-la visível para o software no modo de usuário (para evitar o vazamento de conteúdo potencialmente privilegiado).

Requisitos

Requisito Valor
Cliente mínimo com suporte Disponível a partir do Windows 2000.
Plataforma de Destino Universal
Cabeçalho ntddk.h (inclua Wdm.h, Ntddk.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL

Confira também

AllocateCommonBuffer

DriverEntry

MmAllocateContiguousMemorySpecifyCache

MmAllocateNonCachedMemory

MmFreeContiguousMemory