Função MmAllocateContiguousMemorySpecifyCacheNode (wdm.h)

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

Sintaxe

PVOID MmAllocateContiguousMemorySpecifyCacheNode(
  [in]           SIZE_T              NumberOfBytes,
  [in]           PHYSICAL_ADDRESS    LowestAcceptableAddress,
  [in]           PHYSICAL_ADDRESS    HighestAcceptableAddress,
  [in, optional] PHYSICAL_ADDRESS    BoundaryAddressMultiple,
  [in]           MEMORY_CACHING_TYPE CacheType,
  [in]           NODE_REQUIREMENT    PreferredNode
);

Parâmetros

[in] NumberOfBytes

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

[in] LowestAcceptableAddress

O endereço físico mais baixo válido que o chamador pode usar. Por exemplo, se um dispositivo puder abordar apenas locais acima dos primeiros 8 megabytes do intervalo de endereços de memória física do processador, o driver deste dispositivo deverá definir LowerAcceptableAddress como 0x0000000000800000.

[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.

[in, optional] BoundaryAddressMultiple

O endereço físico múltiplo que o buffer alocado não deve cruzar. Um endereço físico múltiplo deve sempre ser uma potência de dois. Esse parâmetro é opcional e pode ser especificado como zero para indicar que o dispositivo não tem restrições especiais de limite de memória. Para obter mais informações, consulte Comentários.

[in] CacheType

Especifica um valor MEMORY_CACHING_TYPE , que indica o tipo de cache solicitado para a memória física contígua.

[in] PreferredNode

O número de nó preferencial. Se um sistema multiprocessador contiver N nós, os nós serão numerados de 0 a N-1. Se MM_ANY_NODE_OK for especificado ou o computador tiver apenas um nó, a alocação será atendida de qualquer nó. Caso contrário, a alocação será feita do nó preferencial ou se um intervalo satisfatório não puder ser encontrado no nó preferencial, NULL será retornado.

Retornar valor

MmAllocateContiguousMemorySpecifyCacheNode 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

Um driver de dispositivo no modo kernel chama essa rotina para alocar um bloco contíguo de memória física. Em um sistema multiprocessador NUMA (acesso à memória) não uniforme, o chamador pode especificar um nó preferencial do qual alocar a memória. Um nó é uma coleção de processadores que compartilham acesso rápido a uma região de memória. Em um multiprocessador não NUMA ou em um sistema de processador único, MmAllocateContiguousMemorySpecifyCacheNode trata toda a memória como pertencente a um único nó e aloca memória desse nó.

MmAllocateContiguousMemorySpecifyCacheNode 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 MmAllocateContiguousMemorySpecifyCacheNode 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 MmAllocateContiguousMemorySpecifyCacheNode deve ser liberada quando a memória não for mais necessária. Chame a rotina MmFreeContiguousMemory para liberar memória alocada por MmAllocateContiguousMemorySpecifyCacheNode.

Se você especificar um valor diferente de zero para o parâmetro BoundaryAddressMultiple , o intervalo de endereços físicos do bloco de memória alocado não cruzará um limite de endereço que é um múltiplo inteiro desse valor. Um driver deve definir esse parâmetro como zero, a menos que um valor diferente de zero seja necessário para contornar uma limitação de hardware. Por exemplo, se um dispositivo não puder transferir dados entre limites físicos de 16 megabytes, o driver deverá especificar um valor de 0x1000000 para esse parâmetro para garantir que os endereços que o dispositivo vê não sejam encapsulados em um limite de 16 megabytes.

Se você usar a rotina MmAllocateContiguousMemorySpecifyCacheNode em computadores com grandes quantidades de memória, o desempenho do sistema operacional poderá degradar severamente quando o sistema tentar criar uma parte contígua de memória. 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 MmAllocateContiguousMemorySpecifyCacheNode. 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 MmAllocateContiguousMemorySpecifyCacheNode não é inicializada. Um driver de modo kernel deve primeiro zero essa memória se ele vai torná-lo visível para o software no modo de usuário (para evitar o vazamento de conteúdo potencialmente privilegiado).

Requisitos

Requisito Valor
Plataforma de Destino Universal
Cabeçalho wdm.h (include Wdm.h, Ntddk.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL

Confira também

DriverEntry

MEMORY_CACHING_TYPE

MmFreeContiguousMemory