OK, parece que o assunto desta pergunta é uma furphy ... E / S de memória mapeada (concluída corretamente) será tão rápido quanto o processador pode fazê-lo para o hardware que está sendo acessado e não haverá sobrecarga para fazer isso do modo de usuário em oposição ao modo kernel (ou seja, não há "gravação do espaço de usuário no kernel"). / p>
No entanto, você ainda tem que pensar sobre o que está acontecendo quando você faz uma leitura ou escreve em um endereço (é para onde a questão foi movida). Na maioria das arquiteturas, existem dois mapeamentos - o virtual para o físico e o físico para o dispositivo. A primeira é configurada no hardware de memória virtual e a segunda é configurada no controlador de memória.
Além dos mapeamentos, todos os acessos costumam ser feitos através do hardware cache , portanto, você precisa decidir se deseja ou não o acessos a serem armazenados em cache ou não. Se o dispositivo subjacente que está sendo acessado for algum tipo de RAM, você geralmente deseja que os acessos sejam armazenados em cache. Para outros tipos de dispositivos, geralmente você não faz isso.
Pode haver muitas outras coisas em que pensar (por exemplo, se o mapeamento da VM reside no hardware da VM, a largura e o tempo de acessos, prioridade, permissões, etc.), mas o cache é o primeiro.
No caso do @ Karthik, porque ele não havia desativado cache em seu mapeamento, dependendo do tipo de cache, ou de um cache inteiro estava sendo escrita quando ele escrevia para o endereço (write-through), ou a gravação estava sendo atrasada (write-back) (se você quiser algum esclarecimento sobre cache, tente this ).
Para responder às perguntas específicas (acompanhamento), uma vez que o mapeamento de endereço virtual é feito e o cache fez seu trabalho, o acesso vai para o controlador de memória - este hardware decide qual barramento e / ou dispositivo está sendo acessado e a "coisa certa" para esse hardware, geralmente envolvendo a ativação de um chip select e / ou um write enable , talvez copiando uma parte ou todo o físico endereço para linhas de endereço , talvez algum tempo de configuração , etc.
... e a melhor maneira de depurar essas coisas é ter um analisador de algum tipo conectado ao seu dispositivo ou barramento, ou se isso for muito difícil / caro, pode haver algum suporte para depuração no controlador de memória.
Um outro ponto menor, mas importante ... anote a declaração de blink_mem
no código acima - o qualificador de tipo volátil é muito importante. Diz ao compilador para não se esquivar dos acessos ao endereço. Além disso, você deve estar ciente de quaisquer instruções especiais de pipeline relacionadas aos acessos à memória (consulte o eieio em powerpc - alguém tem senso de humor: -)
Finalmente, apenas para reiterar o que foi dito nos comentários, que acabou por ser a resposta real para a pergunta, ao chamar remap_pfn_range () você desliga cache modificando as proteções de página especificadas no último argumento ( prot ) usando a macro pgprot_noncached () . Leia também este e isso e particularmente isso . Felicidades!