Para fazer a memory-mapped I/O (MMIO) funcionar corretamente, cada uma das MMUs precisa ter informações sobre o mapeamento físico da memória, pois:
Leituras em dispositivos de I/O não podem ser colocadas na cache: não há como manter a coerência da cache pois o valor do periférico pode mudar por conta própria, sem que a CPU escreva nele.
Da mesma forma, não faz sentido escrever na cache sem passar o valor para o dispositivo de I/O.
Dispositivos de I/O geralmente não suportam acessos desalinhados nem escritas de largura menor que uma word, pois ao quebrar um acesso em vários, cada um pode ter efeitos colaterais indesejados.
Outro problema relacionado a efeitos colaterais de escrita/leitura é que algumas regiões do endereço físico não podem ser acessados especulativamente (ex.: fazer prefetch de instruções) nem redundantemente.
A essas propriedades chamamos de Physical Memory Attributes (PMA), e a estrutura de hardware responsável por checa-las é o PMA Checker. As duas maneiras principais de se implementar isso é:
Por meio de um circuito "hardwired" (a dúvida que fica é se isso deve ser colocado na MMU ou no Controlador de Barramento/Memória). O mapeamento de memória é conhecido e fixo no momento de design.
Por meio de registradores de controle mapeados em memória, específicos para a nossa plataforma, que permitem configurar essas propriedades em tempo de execução.
Para fazer a memory-mapped I/O (MMIO) funcionar corretamente, cada uma das MMUs precisa ter informações sobre o mapeamento físico da memória, pois:
A essas propriedades chamamos de
Physical Memory Attributes
(PMA), e a estrutura de hardware responsável por checa-las é oPMA Checker
. As duas maneiras principais de se implementar isso é: