Função MmAllocateContiguousNodeMemory (wdm.h)

A rotina MmAllocateContiguousNodeMemory 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 MmAllocateContiguousNodeMemory(
  [in]           SIZE_T           NumberOfBytes,
  [in]           PHYSICAL_ADDRESS LowestAcceptableAddress,
  [in]           PHYSICAL_ADDRESS HighestAcceptableAddress,
  [in, optional] PHYSICAL_ADDRESS BoundaryAddressMultiple,
  [in]           ULONG            Protect,
  [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 Comentários.

[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] Protect

Sinalizar bits que especificam a proteção a ser usada para a memória alocada. O chamador deve definir um (mas não ambos) dos bits de sinalizador a seguir no parâmetro Protect .

Bit de sinalizador Significado
PAGE_READWRITE Alocar memória NX (leitura/gravação, sem execução). A maioria dos chamadores deve definir esse bit de sinalizador. Para obter mais informações, consulte Comentários.
PAGE_EXECUTE_READWRITE Aloque memória de leitura/gravação que seja executável. Esse bit de sinalizador deve ser definido somente se o chamador exigir a capacidade de executar instruções na memória alocada.

Além disso, o chamador pode definir um (mas não ambos) dos bits de sinalizador opcionais a seguir no parâmetro Protect .

Bit de sinalizador Significado
PAGE_NOCACHE Alocar memória não armazenada em cache. Esse bit de sinalizador é semelhante a chamar MmAllocateContiguousMemorySpecifyCache com CacheType definido como MmNonCached.
PAGE_WRITECOMBINE Alocar memória combinada de gravação. Esse bit de sinalizador é semelhante a chamar MmAllocateContiguousMemorySpecifyCache com CacheType definido como MmWriteCombined.

Se nem PAGE_NOCACHE nem PAGE_WRITECOMBINE for especificado, a memória alocada será totalmente armazenada em cache. Nesse caso, o efeito é semelhante a chamar MmAllocateContiguousMemorySpecifyCache com CacheType definido como MmCached.

[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 o chamador definir PreferredNode como MM_ANY_NODE_OK, a rotina escolherá de qual nó alocar memória. Caso contrário, se a memória no intervalo de endereços especificado não puder ser alocada do nó preferencial, a rotina retornará NULL.

Retornar valor

MmAllocateContiguousNodeMemory 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. O driver de chamada pode especificar se deve usar memória NX (sem execução) para a alocação. 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, MmAllocateContiguousNodeMemory trata toda a memória como pertencente a um único nó e aloca memória desse nó.

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

MmAllocateContiguousNodeMemory é semelhante à rotina MmAllocateContiguousMemorySpecifyCacheNode . Ao contrário de MmAllocateContiguousMemorySpecifyCacheNode, MmAllocateContiguousNodeMemory pode ser usado para alocar memória sem execução (NX). Como prática recomendada, um driver deve alocar memória NX, a menos que o driver exija explicitamente a capacidade de executar instruções na memória alocada. Ao alocar memória NX, um driver melhora a segurança impedindo que softwares mal-intencionados executem instruções nessa memória. A memória alocada pelas rotinas MmAllocateContiguousMemory, MmAllocateContiguousMemorySpecifyCache e MmAllocateContiguousMemorySpecifyCacheNode é sempre executável.

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.

A memória alocada por MmAllocateContiguousNodeMemory 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
Cliente mínimo com suporte Disponível a partir do Windows 8.
Plataforma de Destino Universal
Cabeçalho wdm.h (include Wdm.h, Ntddk.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL

Confira também

DriverEntry

MmAllocateContiguousMemory

MmAllocateContiguousMemorySpecifyCache

MmAllocateContiguousMemorySpecifyCacheNode

MmFreeContiguousMemory