Compartilhar via


OEMAddressTable

Windows Mobile Not SupportedWindows Embedded CE Supported

9/8/2008

OEMAddressTable Define uma tabela que mapeia um físico 4 GB espaço de endereço para 512 do kernel-desmapeado MB espaço para um dispositivo. Cada entrada na tabela consiste de endereço virtual de base para mapa (n.); mapear (v.) para, o físico endereço de base para mapa (n.); mapear (v.) do e o número de MB para mapa (n.); mapear (v.).

Os dados devem ser declarados em uma seção ReadOnly e deve haver at least uma entrada non-zero para a estrutura seja válido. Para x 86 - plataformas com hardware, a primeira entrada devem identificar memória RAM e ele deve iniciar em 0x80000000. Para plataformas hardware ARM-based, 0x80000000 podem ser mapeados para nada.

Cada entrada é do seguinte formato.

Virtual Address, Physical Address, Size.

O Tamanho Deve ser um múltiplo de 4 MB para x um múltiplo de 1 e plataformas hardware 86-Based MB de ARM. A última entrada da tabela deve ser zerada. Você pode deixar buracos entre intervalos mas não podem ter intervalos sobrepostos.

O válido apenas intervalo mapeamento memória virtual é de 0x80000000 0x9FFFFFFF.

Para cada entrada criada na tabela, o kernel criará dois intervalos endereço virtual:

  • Um existe no Virtual intervalo do endereço de 0x80000000 para 0x9FFFFFFF e é memória que tenha cache habilitado.

  • O segundo existe no Virtual intervalo do endereço de 0xA0000000 para 0xBFFFFFFF e tiver cache desativado.

    Observação

    Se você modificar a entrada memória RAM no OEMAddressTable, você deve atualização Config.bib para usar o novo mapeamento memória.

Qualquer memória que não está mapeada no tempo inicializar não pode ser acessada diretamente por uma rotina serviço interrupção (ISR) sem primeiro chamado CreateStaticMapping para o endereço mapa (n.); mapear (v.).

O seguinte exemplo de código mostra uma implementação de OEMAddressTable Para x plataformas hardware 86-based, que possui a restrição de VA 0x80000000 = pa 0 x 00000000. Plataformas hardware ARM-Based não tem essa restrição.

public      _OEMAddressTable

   _OEMAddressTable:
   ; 
   ; OEMAddressTable defines the mapping between Physical and Virtual Address
   ;   o MUST be in a READONLY Section
   ;   o First Entry MUST be RAM, mapping from 0x80000000 -> 0x00000000
   ;   o each entry is of the format ( VA, PA, cbSize )
   ;   o cbSize must be multiple of 4M
   ;   o last entry must be (0, 0, 0)
   ;   o must have at least one non-zero entry
   ; RAM 0x80000000 -> 0x00000000, size 64M
   dd  80000000h,    0,   04000000h
   ; FLASH and other memory, if any
   ; dd  FlashVA,      FlashPA,    FlashSize
   ; Last entry, all zeros
   dd  0   0   0

Se um dispositivo com um XScale CPU trava ao executar a instrução que permite que MMU, você pode tentar isolar o problema, incluindo um mapeamento identidade para memória FLASH em OEMAddressTable. Se o mapeamento identidade permitir a execução continue após a falha instrução MMU, isso indica que o problema é específico a XScale CPU. Embora o mapeamento identidade pode get você após a instrução habilitar MMU, é provável a causar o sistema para falhar posteriormente no processo de inicializar quando memória virtual é acessada.

Depois de identificar que esta é a emitir específico XScale, você pode solução alternativa esse problema, executar o seguinte etapas:

  1. Criar mapeamento de identidade na chamar primeiro a OEMARMCacheMode. Você pode determinar se ele é o primeiro chamar por testes se a instrução contador é um físico endereço, na qual maiúsculas e minúsculas MMU não é habilitado ainda.
  2. Em OEMInitDebugSerial, remover o mapeamento identidade.

See Also

Concepts

ARM Microprocessor
x86 Microprocessor