Basicamente, e como um método simples, podemos acessar o cache com o Endereço físico, que é do TLB.
Mas, como outro método, podemos acessar o cache com o Endereço Virtual . Porém, nesse caso, se o cache não for totalmente liberado entre a alternância de contexto (outros dados do processo podem existir no cache), há um problema de alias. A mesma memória pode ser direcionada a partir do endereço virtual diferente.
Mas, no meu livro de texto, incluindo esses problemas, muitos podem ser resolvidos por virtualmente indexados fisicamente . Eu acho que isso ainda pode criar um problema de alias.
Estou errado?
Respostas:
O problema de aliasing pode ser resolvido se selecionarmos o tamanho do cache pequeno o suficiente. Se o tamanho do cache for tal que todos os bits para indexação do cache venham dos bits de deslocamento da página, vários endereços virtuais apontarão para a mesma posição de índice no cache e o alias será resolvido.
Por exemplo, considere o endereço virtual de 32 bits 0xFFFF FFFF, este sistema usa um tamanho de página de 64kB, suponha que o bit de deslocamento da página seja 16 bits. Agora, se selecionarmos Os bits de índice como 10 (número de conjuntos 1024) e o tamanho do bloco como 64 bytes. Em seguida, os bits de índice e os bits de deslocamento de bloco são acomodados nos bits de deslocamento de página do endereço virtual. Considere outro endereço 0xEEEE FFFF, que parece causar alias, mas apesar de ter um endereço virtual diferente, os bits de ordem inferior forçam o mapeamento para o mesmo local no cache e não há alias. A única desvantagem dessa abordagem é que o tamanho do cache é limitado pelo tamanho da página.
fonte
Existem dois aspectos relacionados aos caches e alias de VIPT. E os problemas podem ser um pouco diferentes entre arquiteturas de conjuntos de instruções.
1)
Existem várias maneiras de mapear os endereços virtuais de cada processo para os endereços físicos externos.
Alguns usam "identificadores de processo" ou "identificadores de espaço de endereço" (iirc ARM, SPARC, MIPS) onde cada processo em execução recebe um valor diferente usado para selecionar tabelas de páginas diferentes.
Alguns usam endereços "lógicos / físicos", onde os endereços de cada processo (= lógico) são traduzidos em um espaço de endereço maior (por exemplo, de 32 a 52 bits) (= virtual) compartilhado entre todos os processos, e os TLBs transformam esses endereços virtuais estendidos em endereços físicos. PowerPCs são assim.
Para evitar a necessidade de liberar todos os TLBs e todo o cache durante cada alternância de contexto, as tags de cache (e TLBs) podem armazenar os identificadores de espaço de endereço correspondentes ou endereços virtuais estendidos: Cada endereço de cada processo é diferente e nenhum alias é possível ( bem, às vezes é esperado um aliasing, por exemplo, onde executar código de kernel privilegiado mapeado no mesmo intervalo de endereços virtuais de todos os processos)
2)
Um problema mais sutil é quando vários processos compartilham a mesma área de memória física. Esse intervalo de memória física pode ser mapeado em diferentes endereços virtuais por cada processo. A modificação por um processo pode não ser visível pelo outro. Particularmente com caches de write-back, onde as gravações não são encaminhadas imediatamente para a RAM. Uma solução, com a assistência do sistema operacional, é garantir algum alinhamento entre os processos, dependendo do tamanho do cache, mesmo que os endereços virtuais sejam diferentes entre os diferentes processos, eles terão um alias na mesma linha de cache e se ejetarão automaticamente.
Os caches virtualmente indexados são usados principalmente em CPUs simples (antigas), devido a esses problemas de alias. Atualmente, uma técnica muito comum é limitar cada tamanho do cache L1 ao tamanho da página MMU (geralmente 4kB ou 8kB) para que o índice do cache seja compartilhado entre endereços físicos e virtuais, a busca do cache ocorre ao mesmo tempo que a resolução do endereço MMU .
fonte