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

Traduções de Artigos Traduções de Artigos
Artigo: 189327 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Quando mapeia uma grande quantidade de memória da placa, poderá receber um dos seguintes sintomas:
  • Indisponibilidade do sistema PTEs (NO_MORE_SYSTEM_PTES).
  • Insuficiente espaço de endereço do processo contíguo.
Este artigo explica:
  • porque é que estes problemas ocorrem
  • como contorná-los
  • duas formas para mapear a placa de memória num espaço de endereço do processo

Mais Informação

Introdução às entradas de tabela de páginas (PTE, page table ENTRY)

Cada processo que executa num sistema Windows NT tem um endereço virtual de 4 GB entre 0 x 00000000 e 0xFFFFFFFF para a respectiva utilização. Deste modo, o endereço de 2 GB superior desde 0x8000000 a 0xFFFFFFFF é comum a todos os processos em execução no sistema e é chamado espaço de endereços kernel ou de sistema. A região mais baixa que se situa entre 0 x 00000000 0x7FFFFFFF é designado por espaço de endereço do utilizador.

Refere-na perspectiva do processo, cada elemento de endereço virtual conceptualmente se a um byte de memória física. É da responsabilidade da memória Virtual Gestor (VMM) em conjunto com a unidade de Gestor de memória de processador (MMU) para converter ou mapear cada endereço virtual num endereço físico correspondente. O VMM efectua o mapeamento, dividindo a quantidade de RAM em pacotes de página de tamanho fixo, criar tabelas de páginas para armazenar informações sobre estes pacotes de página e mapeando-los. Cada PTE, page table ENTRY representa uma estrutura de página e contém informações necessárias para o VMM localizar uma página.

Num x 86 sistema que utiliza um tamanho de 4 KB página, o número máximo de PTEs necessárias para mapear 2 GB de espaço de endereços é 524,288 (2 GB/4 KB). Num sistema normal, este espaço é utilizado da seguinte forma:
  • Um máximo de 50.000 PTEs (aproximadamente 195 MB de espaço endereço em) são reservados para utilização geral.
  • O resto é utilizado no mapeamento de cache do sistema, do hiperespaço, de bloco paginado, conjunto não paginado, área de informação de falha e assim sucessivamente.
Este tamanho de conjunto PTE, page table ENTRY é determinado automaticamente no arranque do sistema baseado na quantidade de memória física no sistema. Este conjunto é apertado entre de bloco paginado e conjunto não paginado, que também aumenta com a quantidade de memória física no sistema bem.

O sistema utiliza estes PTEs para criar thread pilhas de kernel, carregar controladores de dispositivos (e as DLL), para mapear o espaço de endereçamento virtual do sistema para transferências de E/s ou chamadas de MmMapIoSpace/MmMapLockedPages/MmGetSystemAddressForMdl/MmAllocateNonCachedMemory e para outros fins diversos. Este sistema conjunto PTE, page table ENTRY pode tornar-se muito utilizado e muito fragmentado. Isto significa que o controlador poderá não conseguir obter suficiente espaço de endereço virtual contígua do sistema PTE, page table ENTRY agrupamento num dado momento, mesmo que o total de endereços espaço ainda na mesma pode ser suficientemente grande.

Também significa que se o controlador utiliza sistema PTE, page table ENTRY conjunto completamente, outras partes do sistema degrada, mesmo resultante em threads não a ser criados, sistema lugares e verificações de erros completamente (porque alguns controladores chamam a atribuir--memória do sistema com o conjunto de parâmetro MustSucceed).

Tem de ter muito cuidado quando utilizar este mapa só de agrupamento. Utilizar as partes da placa de memória RAM que necessita realmente de sistema aceder a de contexto qualquer processo e mapear apenas o valor que necessita. Não mapeie o intervalo de placa todo se não for realmente necessário aceder a partir de modo de sistema.

importante : unmap a memória, assim que tiver no contexto de processo para a direita. Caso contrário, o sistema ficará sem PTEs e irá bugs verificação. Pode aumentar o número predefinido de PTEs calculado com base na memória do sistema total - para um valor máximo adicionando um número (equivalente ao número de páginas para ser aumentado) para o registo em:
   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
   \Memory Management\SystemPages
				
também é possível monitorizar actualmente disponíveis "livre entradas tabela de páginas do sistema" utilizar o Monitor de desempenho.

Nota : A página de memória de placa não é utilizada para substituição de página. Permanecem mapeadas no espaço de endereço do processo mesmo que o processo esteja inactivo ou totalmente trocadas fora.

Seguem-se as duas formas mais comuns para mapear a placa de memória. O primeiro método mapeia a memória directamente no espaço de utilizador do processo e o segundo método mapeia no espaço de sistema do processo e, opcionalmente, no espaço do utilizador. Um destes métodos requerem a memória física seja contíguo. Devido a limitação PTE, page table ENTRY, não poderá mapear uma grande quantidade de memória no espaço de sistema. No entanto, poderá mapear para o espaço de utilizador se não fragmentado ou utilizado.

Método de objecto de secção

O Windows NT 4.0 DDK (disponível através da associação MSDN Professional) que mostra como efectuar este mapeamento tem um exemplo (MAPMEM). Segue-se um destaque a técnica:

  1. Obter o endereço físico convertido da placa de memória (HalTranslateBusAddress).
  2. Abra um identificador de secção (ZwOpenSection) para o \Device\PhysicalMemory de dispositivo de memória física.
  3. Referência de identificador de objecto (ObReferenceObjectByHandle) para impedir que seja eliminado.
  4. Mapear a memória (ZwMapViewOfSection).
O endereço virtual que recebe do ZwMapViewOfSection só é válido no contexto do processo que é mapeado. Se pretender aceder a memória chamada de procedimentos adiadas do controlador (DPC) ou interromper a rotina do serviço (ISR), que é executado num contexto processo arbitrário, também deve mapear a memória do espaço de endereço do sistema (utilize o método seguinte). Unmap (ZwUnMapViewOfSection) a memória no mesmo processo contexto mapeadas antes de sair.

Nota : em geral, pode ser perigoso utilizar ZwMapViewOfSection utilizando \Device\PhysicalMemory, a menos que já possui páginas físicas. Um controlador que mapeia páginas que não possui quase sempre causas Corrupção da memória porque o proprietário pode alterar os atributos de página, liberte as páginas e efectuar outras alterações. Unidades devem mapear a memória que têm. Além disso, é estritamente ilegal para mapear um endereço físico em simultâneo com dois atributos diferentes (isto é, em cache vs vs noncached writecombined). Este procedimento faz com que danos de TLB de processador e resultados imprevisíveis.

No WindowsXP, a função de ZwMapViewOfSection devolve erro STATUS_CONFLICTING_ADDRESSES se controladores tentar mapear o mesmo endereço físico em simultâneo com atributos em conflito.

Método MmMapIoSpace

Este método mostra como mapear a memória no espaço de endereço do processo de sistema e no espaço de endereço de utilizador de processo.
  1. Obter o endereço físico convertido da placa de memória (HalTranslateBusAddress).
  2. Mapear a memória no espaço de endereço do bloco não paginado de sistema da seguinte forma:
          SystemVirtualAddress = MmMapIoSpace(PhysicalAddress, SizeofMemory,
             CacheEnable);
    					
  3. Atribuir um Mdl:
          Mdl = IoAllocateMdl(SystemVirtualAddress, SizeOfMemory, FALSE, FALSE,
             NULL);
  4. Criar a partir de MDL para descrever as páginas de memória:
          MmBuildMdlForNonPagedPool(Mdl);
  5. Mapear a memória para o processo é MmMapLockedPages utilizando o espaço do utilizador. Porque existe uma inconsistência no valor devolvido desta função entre as versões de pré-SP4 e pós-SP4 do Windows NT, utilize a instrução seguinte para tornar este código compatíveis 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 de artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
199311INFO: MmMapLockedPages devolve endereço virtual real no SP4
A vantagem deste método é que obtenha SystemVirtualAddress, que podem ser utilizado em qualquer contexto de processo (tais como os DPCs e ISR) e um UserVirtualAddress que podem ser utilizados pela aplicação de modo de utilizador cujo contexto está mapeado.

Se mapear no espaço de endereço do sistema, deve unmap da seguinte forma:
MmUnmapIoSpace(SystemVirtualAddress, SizeofMemory);
				
se mapear no espaço de endereço do utilizador, deve unmap maneira apenas durante a execução no contexto do processo no qual mapeado a memória:
MmUnmapLockedPages(UserVirtualAddress, Mdl); 

Finally, free the MDL by calling:

IoFreeMdl(Mdl);
				

Referências

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

Propriedades

Artigo: 189327 - Última revisão: 7 de março de 2005 - Revisão: 1.2
A informação contida neste artigo aplica-se a:
  • Microsoft Win32 Device Driver Kit para 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 189327
Exclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.

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