OEMAddressTable
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:
- 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.
- Em OEMInitDebugSerial, remover o mapeamento identidade.