Como mapear adaptador RAM no espaço de endereço de processo

Traduções deste artigo Traduções deste artigo
ID do artigo: 189327 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Quando você mapeia uma grande quantidade de memória do adaptador, você pode receber uma das seguintes sintomas:
  • Indisponibilidade do sistema NO_MORE_SYSTEM_PTES (PTEs).
  • Não há processo contíguo endereço espaço suficiente.
Este artigo explica:
  • Por que esses problemas ocorrem
  • como trabalhar em torno deles
  • duas maneiras de mapear adaptador memória para um espaço de endereço de processo

Mais Informações

Introdução a entradas de tabela página (PTE)

Cada processo é executado em um sistema Windows NT tem um endereço virtual de 4 GB que varia de 0 x 00000000 a 0xFFFFFFFF para seu uso. Isso, o endereço de 2 GB superior desde 0x8000000 até 0xFFFFFFFF é comum a todos os processos em execução no sistema e ele é chamado espaço de endereço de kernel ou sistema. A região menor que varia de 0 x 00000000 a 0x7FFFFFFF é chamada de espaço de endereço do usuário.

Da perspectiva do processo, cada elemento de endereço virtual conceitualmente se refere a um byte de memória física. É responsabilidade da memória Virtual Manager (VMM) em conjunto com processador de unidade de Gerenciador de memória (MMU) para converter ou mapear cada endereço virtual para um endereço físico correspondente. O VMM executa o mapeamento, dividindo a RAM em quadros da página de tamanho fixo, criar tabelas de página para armazenar informações sobre esses quadros da página e mapeamento-os. Cada PTE representa um quadro de página e contém informações necessárias para o VMM localizar uma página.

Em um x 86-based sistema que usa um tamanho de página de 4 KB, o número máximo de PTEs necessárias para mapear 2 GB de espaço de endereço é 524,288 (2 GB/4 KB). Em um sistema típico, esse espaço é usado da seguinte maneira:
  • Um máximo de 50.000 PTEs (aproximadamente 195 MB endereço espaço) são reservados para uso geral.
  • O restante é usado no mapeamento de cache do sistema, hiperespacial, pool paginado, não-paginável, área de despejo de falha e assim por diante.
Esse tamanho de pool de PTEs é determinado automaticamente na inicialização do sistema com base na quantidade de memória física no sistema. Esse pool é compactado entre pool paginável e pool não paginado, que também aumenta com a quantidade de memória física no sistema bem.

O sistema usa estas PTEs para criar pilhas de thread de kernel, carregar drivers de dispositivo (e suas DLLs), para mapear o espaço de endereço virtual do sistema para transferências de E/s ou chamadores de MmMapIoSpace/MmMapLockedPages/MmGetSystemAddressForMdl/MmAllocateNonCachedMemory e para outros fins diversos. Neste pool de PTEs do sistema pode se tornar muito usado e muito fragmentado. Isso significa que o driver pode não ser capaz de obter espaço de endereço virtual contígua do pool de PTEs do sistema, a qualquer momento, mesmo que o total endereço espaço ainda restantes nela pode ser grande o suficiente.

Isso também significa que se o driver usa totalmente pool de PTEs do sistema, outras partes do sistema irão degradar, mesmo resultando em threads não sendo criados, vagas de sistema e verificações de bug imediatamente (porque alguns drivers chamam alocar-memória do sistema com o conjunto de parâmetros MustSucceed).

Você deve ser extremamente cuidadoso ao usar este mapa somente pool. Use as partes do adaptador de RAM que você realmente precisa sistema acessem de qualquer contexto de processo e mapeiam apenas a quantidade que você precisa. Não mapeie o intervalo inteiro adaptador se você realmente não precisar acessá-lo todos do modo de sistema.

importante : a memória de desmapeamento assim que terminar no contexto de processo à direita. Caso contrário, o sistema ficará sem PTEs e ele será bug seleção. Você pode aumentar o número padrão de calculado PTEs com base na memória total do sistema - up para um valor máximo, adicionando um número (igual ao número de páginas a ser aumentado) do Registro:
   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
   \Memory Management\SystemPages
				
você também pode monitorar atualmente disponíveis "sistema entradas livres de tabela de página" usando o desempenho do sistema.

Observação : as adaptador as páginas de memória não são usadas para substituição de página. Eles permanecerão mapeados no espaço de endereço do processo mesmo que haja o processo ocioso ou totalmente trocadas check-out.

Seguinte é as duas maneiras mais comuns para mapear a memória do adaptador. O primeiro método mapeia a memória diretamente no espaço de usuário do processo, e o segundo método mapeia no sistema-espaço do processo e, opcionalmente, no espaço do usuário. Ambos os métodos requerem a memória física a ser contíguo. Devido a limitação de PTE, talvez não seja capaz de mapear uma grande quantidade de memória do sistema-espaço. No entanto, talvez seja possível mapear no espaço do usuário se não estiver fragmentado ou usado.

Método de objeto de seção

Há um exemplo (MAPMEM) no DDK do Windows NT 4.0 (disponível através de participação em MSDN Professional) que mostra como realizar esse mapeamento. Aqui está uma estrutura de tópicos da técnica:

  1. Obter o endereço físico traduzido da memória do adaptador (HalTranslateBusAddress).
  2. Abrir um identificador de seção (ZwOpenSection) para o \Device\PhysicalMemory de dispositivo de memória física.
  3. Fazer referência ao identificador de objeto (ObReferenceObjectByHandle) para impedir que ele seja excluído.
  4. Mapear a memória (ZwMapViewOfSection).
O endereço virtual que você obter o ZwMapViewOfSection só é válido no contexto do processo que é mapeado. Se você deseja acessar a memória em chamada de procedimento deferidas do driver (DPC) ou interromper o serviço rotina (ISR), que é executado em um contexto de processo arbitrário, você também deve mapear a memória no espaço de endereço de sistema (use o método seguinte). (ZwUnMapViewOfSection) a memória no mesmo contexto de processo que mapeado antes de desmapeamento sai.

Observação : em geral, pode ser perigoso usar ZwMapViewOfSection usando \Device\PhysicalMemory a menos que você já possui as páginas físicas. Um driver que mapeia páginas que não possui quase sempre causas corrupção de memória pois o proprietário pode alterar os atributos de página, liberar as páginas e fazer outras alterações. Unidades devem mapear a memória que eles possuem. Além disso, é estritamente ilegal para mapear um endereço físico simultaneamente com dois atributos diferentes (ou seja, em cache vs vs noncached writecombined). Isso faz com que processador TLB corrupção e resultados imprevisíveis.

Em WindowsXP, a função ZwMapViewOfSection retorna erro STATUS_CONFLICTING_ADDRESSES se drivers tentam mapear o mesmo endereço físico simultaneamente com atributos conflitantes.

Método MmMapIoSpace

Esse método mostra como mapear a memória no espaço de endereço de sistema de processo e no espaço de endereço do usuário de processo.
  1. Obter o endereço físico traduzido da memória do adaptador (HalTranslateBusAddress).
  2. Mapear a memória no espaço de endereço não-paginável do sistema da seguinte maneira:
          SystemVirtualAddress = MmMapIoSpace(PhysicalAddress, SizeofMemory,
             CacheEnable);
    					
  3. Alocar um Mdl:
          Mdl = IoAllocateMdl(SystemVirtualAddress, SizeOfMemory, FALSE, FALSE,
             NULL);
  4. Criar MDL para descrever as páginas de memória:
          MmBuildMdlForNonPagedPool(Mdl);
  5. Mapear a memória para o processo esteja usando o espaço do usuário MmMapLockedPages. Porque há uma inconsistência no valor de retorno desta função entre versões de pré-SP4 e posterior ao SP4 do Windows NT, usar a instrução a seguir para tornar este código compatível com todas as versões do Windows NT:
          UserVirtualAddress = (PVOID)(((ULONG)PAGE_ALIGN(MmMapLockedPages(Mdl,
             Mode))) + MmGetMdlByteOffset(Mdl));
    					
Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
199311INFO: MmMapLockedPages retorna real de endereço virtual no SP4
A vantagem desse método é que você obtenha SystemVirtualAddress, que podem ser usado em qualquer contexto de processo (como DPCs e ISR) e um UserVirtualAddress que podem ser usado pelo aplicativo de modo de usuário em cujo contexto está mapeada.

Se você mapear no espaço de endereço do sistema, você deve desmapeamento da seguinte maneira:
MmUnmapIoSpace(SystemVirtualAddress, SizeofMemory);
				
se você mapear para espaço de endereço do usuário, você deve desmapeamento da seguinte maneira somente enquanto estiver executando no contexto do processo no qual você mapeou a memória:
MmUnmapLockedPages(UserVirtualAddress, Mdl); 

Finally, free the MDL by calling:

IoFreeMdl(Mdl);
				

Referências

Para obter mais informações, consulte a documentação do DDK do Windows NT 4.0, ou "Inside Windows NT" por Helen Custer (Microsoft Press 1993).

Propriedades

ID do artigo: 189327 - Última revisão: segunda-feira, 7 de março de 2005 - Revisão: 1.2
A informação contida neste artigo aplica-se a:
  • Microsoft Win32 Device Driver Kit for Windows NT 4.0
Palavras-chave: 
kbmt kbhowto kbkmode KB189327 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 189327
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com