2015-11-01 5 views
1

J'ai lu le document à propos de l'instruction CLFLUSH de la machine Intel x86. Je comprends que CLFLUSH m8 signifie vider la ligne de cache contenant l'adresse linéaire m8 si je cours l'instruction à l'intérieur d'un module Linux sur le métal nu. Cependant, que se passe-t-il si je veux exécuter l'instruction dans une machine virtuelle dans un environnement de virtualisation? Quel est le paramètre de CLFLUSH? Pour être spécifique, supposons que je veuille vider une ligne de cache qui contient le contenu de l'adresse virtuelle va d'un programme dans une machine virtuelle. L'adresse virtuelle va est mappée à l'adresse physique pa dans la machine virtuelle et pa sera mappée à l'adresse de la machine ma dans le VMM/hyperviseur. Quelle adresse dois-je utiliser pour l'instruction CLFLUSH, va, pa ou ma?CLFLUSH dans l'environnement de virtualisation

Merci beaucoup!

+3

Répondons de cette façon. Je suis sûr que vous serez d'accord pour dire que le logiciel devrait fonctionner de manière identique dans des environnements virtualisés et non virtualisés, et que dans l'idéal, il devrait être incapable de dire qu'il est virtualisé. La réponse à votre question suit immédiatement; Vous utilisez n'importe quelle adresse que vous auriez utilisée si elle était en mode bare-metal, tout simplement parce que vous n'auriez aucun moyen de savoir si vous êtes en fait en train d'exécuter du bare-metal ou non. –

+0

Ceci est une observation agréable! Je suis d'accord. Cependant, la raison pour laquelle le logiciel n'a aucune idée s'il s'exécute dans un environnement virtualisé ou non virtualisé est que le VMM/hyperviseur a virtualisé l'instruction. Si le VMM ne supporte pas cette instruction et que je souhaite étendre l'hypercall du VMM pour le supporter, je devrai savoir quelle adresse l'hyperviseur doit utiliser pour l'instruction CLFLUSH. Ai-je raison? – Mike

+0

Si l'hyperviseur peut utiliser l'adresse 'va', je me demande comment le matériel peut déterminer quelle ligne de cache doit être vidée en fonction de' va'? Sur le métal nu, je peux comprendre que le matériel peut utiliser le registre CR3 pour transférer l'adresse 'va' à l'adresse de la machine pour trouver la ligne de cache à vider. Mais dans un environnement virtualisé, le matériel fera-t-il automatiquement la traduction de 'va' à' ma'? – Mike

Répondre

2

clflush n'est pas une instruction privilégiée. Les processus utilisateur peuvent l'exécuter, tout comme ils peuvent exécuter les instructions load, store, prefetch et movnt (stockage avec expulsion du cache) qui affectent également le cache. Je m'attends à ce qu'il virtualise très bien, sans aucun support d'hyperviseur, car il utilise des adresses de la même manière que les autres références de mémoire. Étant donné que la virtualisation matérielle permet à l'UC de faire une traduction complète des adresses virtuelles invitées vers des adresses physiques matérielles, le comportement souhaité (ligne de cache synchronisée sur la mémoire physique) doit se produire sans intervention de l'hyperviseur.