Caches cpu, cache flushes et accès mémoire
Bonjour,
Je me demandais un peu comment fonctionnaient les caches CPU, et comment le CPU pouvait déterminer si le cache doit être mis à jour ou non. Notamment je me pose la question lorsque du matos va écrire en RAM, via du DMA et que le CPU accède à la même portion de mémoire.
Je comprends sans problème que les caches CPU ne sont pas tout le temps à jour par rapport à la mémoire, ou même entre deux caches non partagés de deux cores. Je vois aussi bien comment il est possible, via des instructions de demander explicitement un flush des caches pour les synchroniser avec la mémoire. Je ne suis pas certain ceci dit de la signification et de l'opération exacte faite par chaque instruction, donc peut être que quelqu'un pourrait m'expliquer plus clairement les opérations de chacune.
En gros, de ce que je connais, on peut utiliser mfence, sfence, lfence ou clflush pour synchroniser les cores et contrôler le cache. Mais plus précisément, qu'est-ce que fait chacune ? sfence et lfence n'ont pas d'impact sur le cache, il s'agit juste de points de synchro pour les instructions executées sur un même core, non ?
Autre question, comment un core va-t-il décider ou non de rafraichir son cache ? Si l'on a appelé clflush, la ligne de cache va être explicitement marquée comme à rafraichir, et au prochain accès à cette ligne, un accès mémoire aura lieu, c'est ça ? Si l'on ne fait pas clflush, à quel moment le CPU va-t-il décider de faire tout de même cet accès mémoire ?
Si une carte utilisant du DMA pour fournir des données écrit directement en mémoire, est-il nécessaire d'executer des clflush pour que les CPU voient les modifications en mémoire plus rapidement ? Ne perd-t-on pas du temps CPU à faire des accès mémoire même s'il n'y en a pas besoin (si la carte n'a pas modifié la mémoire, le clflush s'avère inutile) ? Si aucun clflush n'est executé, quand le CPU va-t-il se rendre compte que la mémoire a été modifiée par la carte ?
Je suppose que c'est lié au fonctionnement du contrôleur mémoire et de son intégration ou non au CPU ? Une idée de lecture possible sur le sujet ou de ou je pourrais trouver plus d'infos là dessus ?
PS : Je suis un peu noob sur le sujet, donc soyez indulgents si je raconte de la merde :)