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
MmAllocateContiguousMemorySpecifyCache