Comment vider le cache du processeur pour une région d'espace d'adressage sous Linux?
Je suis intéressé à flushing cache (L1, L2, et L3) seulement pour une région de l'espace d'adresse, par exemple toutes les entrées du cache à partir d'Une adresse à l'adresse de B. Est-il un mécanisme pour le faire sous Linux, que ce soit à partir de l'utilisateur ou de l'espace du noyau?
source d'informationauteur aminfar
Vous devez vous connecter pour publier un commentaire.
Consultez cette page pour la liste des méthodes de rinçage dans le noyau de linux: https://www.kernel.org/doc/Documentation/cachetlb.txt
Il y a de la gamme de rinçage fonctions
Vous pouvez également vérifier la mise en œuvre de la fonction - http://lxr.free-electrons.com/ident?a=sh;i=flush_cache_range
Par exemple, dans les bras de http://lxr.free-electrons.com/source/arch/arm/mm/flush.c?a=sh&v=3.13#L67
C'est pour les BRAS.
GCC fournit
__builtin___clairs_cache
quidevrait faire syscallcacheflush
. Cependant, il peut avoir son mises en garde.Chose importante ici est de Linux, un système d'appel (BRAS spécifique) pour vider les caches. Vous pouvez le vérifier Android/Bionic flushcache pour savoir comment utiliser cet appel système. Cependant, je ne suis pas sûr de ce genre de garanties Linux, lorsque vous appelez ou comment elle est mise en œuvre par le biais de son fonctionnement interne.
Ce blog Caches et Self-Modifying Code peut aider les autres.
Dans la version x86 de Linux, vous pouvez également trouver une fonction
void clflush_cache_range(void *vaddr, unsigned int size)
qui est utilisé pour les fins de vider le cache de gamme. Cette fonction s'appuie à laCLFLUSH
ouCLFLUSHOPT
instructions. Je voudrais vous recommandons de vérifier que votre processeur supporte, parce qu'en théorie, ils sont facultatifs.CLFLUSHOPT
est faiblement commandé.CLFLUSH
a été spécifié à l'origine, comme l'a ordonné que parMFENCE
mais tous les Processeurs qui mettent en œuvre-il le faire avec une forte commande de wrt. écrit et d'autresCLFLUSH
instructions. Intel a décidé d'ajouter une nouvelle instruction (CLFLUSHOPT
) au lieu de changer le comportement deCLFLUSH
et de mettre à jour le manuel afin de garantir que les futurs Processeurs mettra en œuvreCLFLUSH
aussi fortement commandé. Pour ce faire, vous devezMFENCE
après utilisation, assurez-vous que le rinçage est fait avant que les charges de votre indice de référence (et pas seulement les magasins).Fait x86 offre un enseignement qui pourrait être utile:
CLWB
.CLWB
efface les données de la mémoire cache-mémoire sans expulser d'elle, la laissant propre, mais encore mis en cache.Noter aussi que ces instructions sont cache cohérente. Leur exécution va affecter tous les caches de tous les processeurs (cœurs de processeur) dans le système.
L'ensemble de ces trois instructions sont disponibles en mode utilisateur. Ainsi, vous pouvez utiliser l'assembleur et de créer votre propre
void clflush_cache_range(void *vaddr, unsigned int size)
dans votre espace utilisateur de l'application (mais ne pas oublier de vérifier leur disponibilité, avant l'utilisation réelle).Si j'ai correctement compris, il est beaucoup plus difficile de raisonner sur les BRAS à cet égard. La famille de BRAS-processeurs est beaucoup moins régulière, puis de la famille de l'IA-32 processeurs. Vous pouvez avoir un BRAS avec plein de fonctionnalités caches, et un autre complètement sans les caches. De plus, de nombreux fabricants peuvent utiliser personnalisés MMUs et MPUs. Donc, il est préférable de raisonner sur certains de processeur ARM modèle.
Malheureusement, on dirait qu'il sera presque impossible d'effectuer toute estimation raisonnable du temps nécessaire pour vider certaines données. Ce temps est affecté par de trop nombreux facteurs, y compris le nombre de lignes de cache vidé, non ordonnée l'exécution des instructions, de l'état de TLB (parce que l'instruction prend une adresse virtuelle, comme un argument, mais les caches utiliser les adresses physiques), le nombre de Processeurs dans le système, la charge réelle en termes d'opérations de mémoire sur les autres processeurs dans le système, et le nombre de lignes de la gamme sont en fait mis en cache par les transformateurs, et enfin par les performances du PROCESSEUR, de la mémoire, contrôleur de mémoire et la mémoire de bus. En fait, je pense que le temps d'exécution varie considérablement dans les différents environnements et avec des charges différentes. Le seul moyen raisonnable est de mesurer la chasse d'eau de temps sur le système et avec une charge semblable au système cible.
Et dernière remarque, ne pas confondre les caches et la TLB. Ils sont tous les deux caches mais organisés de différentes manières et de servir à des fins différentes. TLB caches juste plus récemment utilisé des traductions entre les adresses virtuelles et physiques, mais pas les données qui sont pointés par des adresses.
Et TLB n'est pas cohérent, contrairement à la mémoire des caches. Soyez prudent, car le rinçage de la TLB entrées ne conduise pas à rougir de données appropriées à partir de la mémoire cache.
Plusieurs personnes ont exprimé des doutes sur
clear_cache
. Ci-dessous est une procédure manuelle pour supprimer le cache qui est efficace, mais possible à partir de l'espace utilisateur de la tâche (tout OS).PLD/LDR
Il est possible d'expulser les caches par mis-à l'aide de la
pld
instruction. Lepld
va chercher une ligne de cache. Afin d'expulser une mémoire spécifique de l'adresse, vous avez besoin de connaître la structure de vos caches. Par exemple, un cortex-a9 a un 4-way cache de données avec 8 mots par ligne. La taille du cache est configurable en 16 KO, 32 KO, ou de 64 ko. Donc, c'est de 512, 1024 ou 2048 lignes. Les moyens sont toujours négligeables à la baisse des bits de l'adresse (de manière séquentielle adresses n'entrent pas en conflit). Donc, vous devrez remplir une nouvelle manière d'accéder àmemory offset + cache size /ways
. Donc, c'est tous les 4 KO, 8 KO et 16 ko pour un cortex-a9.À l'aide de
ldr
en 'C' ou 'C++' est simple. Vous avez juste besoin de la taille d'un tableau de façon appropriée et d'accès.Voir: Par programmation obtenir la taille de ligne de cache?
Par exemple, si vous voulez expulser 0x12345 la ligne commence à 0x12340 et pour un 16 ko au round-robin cache un
pld
sur 0x133400x143400x15340et 0x16340 serait d'expulser tout de valeur de cette façon. Le même principe peut être appliqué pour expulser L2 (ce qui est souvent unifié). Une itération sur l'ensemble de la taille du cache de l'expulsion de l'intégralité du cache. Vous avez besoin d'allouer de la mémoire inutilisée de la taille de la mémoire cache pour supprimer le cache entier. Cela pourrait être assez grand pour la L2.pld
n'a pas besoin d'être utilisé, mais un plein accès à la mémoire (ldr/ldm
). Pour plusieurs Processeurs (fileté cache expulsion), vous devez exécuter l'expulsion sur chaque PROCESSEUR. Généralement, la L2 est globale pour tous les Processeurs de sorte qu'il ne doit être exécuté une seule fois.NB: Cette méthode fonctionne uniquement avec LRU (moins récemment utilisé) ou round-robin caches. Pour les pseudo-aléatoire de remplacement, vous aurez pour écrire/lire des données plus à assurer l'expulsion, avec un montant exact étant très PROCESSEUR spécifique. Le BRAS de remplacement aléatoire est basé sur un LFSR qui est de 8-33bits en fonction de la CPU. Pour certains Processeurs, la valeur par défaut round-robin et les autres par défaut à la pseudo-aléatoire mode. Pour un peu de Cpu un noyau Linux, la configuration permet de sélectionner le mode. ref: CPU_CACHE_ROUND_ROBIN Cependant, pour des Processeurs récents, Linux va utiliser la valeur par défaut du chargeur de démarrage et/ou de silicium. En d'autres termes, il vaut la peine d'essayer et obtenir de l'
clear_cache
OS appels à travailler (voir les autres réponses) si vous avez besoin d'être complètement générique ou vous aurez à passer beaucoup de temps pour effacer les caches de manière fiable.Contexte swich
Il est possible de contourner le cache en trompant un système d'exploitation à l'aide de la MMU sur certains Processeurs ARM et en particulier les Systèmes d'exploitation. Sur un *nix système, vous avez besoin de plusieurs processus. Vous avez besoin de basculer entre les processus et le système d'exploitation doivent vider les caches. Typiquement, cela ne fonctionnera que sur les anciens Processeurs ARM (ceux ne supportant pas la
pld
) où le système d'exploitation doivent vider les caches de veiller à ne pas les fuites d'informations entre les processus. Il n'est pas portable, et vous devez le comprendre beaucoup de choses sur votre système d'exploitation.Plus explicite cache rinçage registres sont restreints à la mode du système afin de prévenir déni de service des attaques de type entre les processus. Certains exploits pouvez essayer d'obtenir des renseignements en voyant ce que les lignes ont été expulsées par un autre processus (ce qui peut donner des informations sur ce que les adresses d'un autre processus, pour y accéder. Ces attaques sont plus difficiles avec des pseudo-aléatoire de remplacement.