Função MmAllocateContiguousMemorySpecifyCache (ntddk.h)
A rotina MmAllocateContiguousMemorySpecifyCache 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 MmAllocateContiguousMemorySpecifyCache(
[in] SIZE_T NumberOfBytes,
[in] PHYSICAL_ADDRESS LowestAcceptableAddress,
[in] PHYSICAL_ADDRESS HighestAcceptableAddress,
[in, optional] PHYSICAL_ADDRESS BoundaryAddressMultiple,
[in] MEMORY_CACHING_TYPE CacheType
);
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] CacheType
Especifica um valor MEMORY_CACHING_TYPE , que indica o tipo de cache permitido para a memória solicitada.
Retornar valor
MmAllocateContiguousMemorySpecifyCache retorna o endereço virtual base para a memória alocada. Se o sistema não puder alocar o buffer solicitado, a rotina retornará NULL.
Comentários
MmAllocateContiguousMemorySpecifyCache 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 MmAllocateContiguousMemorySpecifyCache 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 MmAllocateContiguousMemorySpecifyCache deve ser liberada quando a memória não for mais necessária. Chame a rotina MmFreeContiguousMemory para liberar memória alocada por MmAllocateContiguousMemorySpecifyCache.
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 MmAllocateContiguousMemorySpecifyCache 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 MmAllocateContiguousMemorySpecifyCache. 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 MmAllocateContiguousMemorySpecifyCache 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 2000. |
Plataforma de Destino | Universal |
Cabeçalho | ntddk.h (inclua Wdm.h, Ntddk.h) |
Biblioteca | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |