Pergunta

Em um aplicativo embutido, temos uma tabela que descreve os vários intervalos de endereços que são válidos em fora placa alvo. Esta tabela é usada para configurar o MMU.
O intervalo de endereços RAM é marcado como em cache, mas outras regiões são marcadas por não cacheable. Por que isso?

Foi útil?

Solução

Se uma região de memória é acessado por hardware e software simultaneamente (EX: hardware registro de configuração ou lista de dispersão-se reúnem para DMA), esta região deve ser definida como não armazenada em cache. Para DMA real, o buffer de memória pode ser definida como cache, e na maioria dos casos, é aconselhável para o buffer para ser armazenada em cache para permitir que o nível de aplicação acesso rápido a esse buffer. É responsabilidade do motorista para rubor cache / invalidar antes de passar o buffer para DMA ou a aplicação.

update pequeno, acima de deve não é correto no caso, temos um hardware especializado, ou seja, de coerência de cache Interconnect (CCI), que irá sincronizar o acesso de vários blocos de hardware para a memória.

Outras dicas

Isto é feito para que o processador não usa valores obsoletos devido ao cache. Quando você acessa (regular) RAM em cache, o processador pode "lembrar" o valor que você acessou. A próxima vez que você olhar para essa mesma posição de memória, o processador irá retornar o valor que ele se lembra, sem olhar na RAM. Este é o cache.

Se o conteúdo da localização pode ser alterado sem o processador saber como poderia ser o caso se você tiver um dispositivo de memória mapeada (um FPGA retornando alguns pacotes de dados, por exemplo), o processador poderia retornar o valor é "lembrado" de última tempo, o que seria errado.

Para evitar esse problema, você marcar esse espaço de endereço como não-cacheable. Isto garante que o processador não tente se lembrar o valor.

Qualquer região de memória usado para DMA ou outras interações de hardware não deve ser armazenado em cache.

Talvez ele é usado para mapeamento de memória I / O?

Algumas áreas como o Flash pode ser lido em um ciclo, por isso não precisa ser armazenada em cache.

Controladores modernos podem usar o cache L2 para DMA, o que significa que preservar a coerência da região de memória cache usado para DMA acessos. Isso também é denominado como "transações de memória snoop-able" realizados pelo controlador (via DMA).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top