Compartilhar via


Função MmAllocatePagesForMdl (wdm.h)

A rotina MmAllocatePagesForMdl aloca páginas de memória física de preenchimento zero, não paginadas para um MDL.

Sintaxe

PMDL MmAllocatePagesForMdl(
  [in] PHYSICAL_ADDRESS LowAddress,
  [in] PHYSICAL_ADDRESS HighAddress,
  [in] PHYSICAL_ADDRESS SkipBytes,
  [in] SIZE_T           TotalBytes
);

Parâmetros

[in] LowAddress

Especifica o endereço físico do início do primeiro intervalo de endereços do qual as páginas alocadas podem vir. Se MmAllocatePagesForMdl não puder alocar o número solicitado de bytes no primeiro intervalo de endereços, ele itera por meio de intervalos de endereços adicionais para obter mais páginas. Em cada iteração, MmAllocatePagesForMdl adiciona o valor de SkipBytes ao endereço inicial anterior para obter o início do próximo intervalo de endereços.

[in] HighAddress

Especifica o endereço físico do final do primeiro intervalo de endereços do qual as páginas alocadas podem vir.

[in] SkipBytes

Especifica o número de bytes a serem ignorados do início do intervalo de endereços anterior do qual as páginas alocadas podem vir. SkipBytes deve ser um número inteiro múltiplo do tamanho da página de memória virtual, em bytes.

[in] TotalBytes

Especifica o número total de bytes a serem alocados para o MDL.

Retornar valor

MmAllocatePagesForMdl retorna um dos seguintes:

Código de retorno Descrição
Ponteiro MDL O ponteiro MDL descreve um conjunto de páginas físicas no intervalo de endereços especificado. Se o número solicitado de bytes não estiver disponível, o MDL descreverá a quantidade de memória física disponível.
NULL Não há páginas de memória física nos intervalos de endereços especificados ou não há pool de memória suficiente para o próprio MDL.

Comentários

Os drivers em execução no Windows Server 2003 Service Pack 1 (SP1) e versões posteriores do Windows devem usar a rotina MmAllocatePagesForMdlEx em vez de MmAllocatePagesForMdl. MmAllocatePagesForMdlEx fornece melhor desempenho do que MmAllocatePagesForMdl , evitando liberações desnecessárias do TLB (buffer lookaside de tradução) e da memória de cache.

As páginas de memória física retornadas por MmAllocatePagesForMdl normalmente não são páginas contíguas. MmAllocatePagesForMdl sempre preenche as páginas alocadas no MDL retornado com zeros.

MmAllocatePagesForMdl foi projetado para ser usado por drivers no modo kernel que não precisam de endereços virtuais correspondentes (ou seja, precisam de páginas físicas e não precisam que as páginas sejam fisicamente contíguas) ou por drivers no modo kernel que podem obter ganhos substanciais de desempenho se a memória física de um dispositivo for alocada em um intervalo de endereços físico específico. Um driver para um gráfico AGP cartão é um exemplo desse driver.

Dependendo da quantidade de memória física disponível atualmente nos intervalos solicitados, MmAllocatePagesForMdl pode retornar um MDL que descreve menos memória do que foi solicitado. A rotina retornará NULL se nenhuma memória tiver sido alocada. O chamador deve marcar a quantidade de memória que é realmente alocada para o MDL.

O chamador deve usar MmFreePagesFromMdl para liberar as páginas de memória descritas por um MDL criado por MmAllocatePagesForMdl. Depois de chamar MmFreePagesFromMdl, o chamador também deve chamar ExFreePool para liberar a memória alocada para a própria estrutura MDL.

No Windows 2000 e versões posteriores do Windows, a quantidade máxima de memória que MmAllocatePagesForMdl pode alocar em uma única chamada é (4 gigabytes - PAGE_SIZE). A rotina só poderá atender a uma solicitação de alocação para esse valor se páginas suficientes estiverem disponíveis.

MmAllocatePagesForMdl é executado em IRQL <= APC_LEVEL. O Windows Server 2008 e versões posteriores do sistema operacional Windows permitem que os chamadores MmAllocatePagesForMdl chamem em DISPATCH_LEVEL. No entanto, você pode melhorar o desempenho do driver chamando em APC_LEVEL ou abaixo.

Chamar MmAllocatePagesForMdl de uma chamada de procedimento assíncrona de kernel especial (APC) pode levar a uma aquisição recursiva de um bloqueio exclusivo, que está apenas em uma região crítica (APCs de kernel normais ou de usuário desabilitadas), mas não em uma região protegida (todas as APCs desabilitadas).

Requisitos

Requisito Valor
Plataforma de Destino Universal
Cabeçalho wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL Consulte a seção Observações.
Regras de conformidade de DDI HwStorPortProhibitedDIs(storport), IrqlMmApcLte(wdm), SpNoWait(storport), StorPortStartIo(storport)

Confira também

ExFreePool

MmAllocatePagesForMdlEx

MmFreePagesFromMdl

MmMapLockedPages