Toutes les suggestions/discussions sont les bienvenues !
La question est en fait brève en tant que titre, mais je vais expliquer pourquoi j'ai besoin d'une adresse physique.
Contexte :
Ces jours-ci, je suis fasciné par le cache et les architectures multi-cœurs, et je suis maintenant curieux de savoir comment le cache influence nos programmes, dans un environnement parallèle.
Dans certains modèles de CPU (par exemple, mon Intel Core Duo T5800), le cache L2 est partagé entre les cœurs. Ainsi, si le programme A accède à la mémoire à l'adresse physique suivante
0x00000000, 0x20000000, 0x40000000...
et le programme B accède aux données à
0x10000000, 0x30000000, 0x50000000...
Étant donné que ces adresses partagent le même suffixe, l'ensemble correspondant dans la mémoire cache L2 sera fréquemment nettoyé. Nous nous attendons donc à voir deux programmes se battre l'un contre l'autre, en lisant lentement les données de la mémoire au lieu de la mémoire cache, bien qu'ils soient séparés dans des cœurs différents.
Je souhaite ensuite vérifier le résultat dans la pratique. Dans cette expérience, je dois connaître l'adresse physique au lieu de l'adresse virtuelle. Mais comment puis-je faire face à cette situation ?
La première tentative :
Manger un grand espace du tas, masquer, et obtenir l'adresse certaine.
Mon processeur dispose d'un cache L2 d'une taille de 2048 Ko et d'une associativité de 8, de sorte que des adresses physiques telles que 0x12340000, 0x12380000, 0x123c0000
sera lié au premier ensemble dans le cache L2.
int HEAP[200000000]={0};
int *v[2];
int main(int argc, char **argv) {
v[0] = (int*)(((unsigned)(HEAP)+0x3fffc) & 0xfffc0000);
v[1] = (int*) ((unsigned)(v[0]) + 0x40000);
// one program pollute v[0], another polluting v[1]
}
Malheureusement, avec "l'aide" de la mémoire virtuelle, les variables HEAP
n'est pas toujours continue dans la mémoire physique. v[0]
et v[1]
peuvent être liés à différents jeux de caches.
La deuxième tentative
accès /proc/self/mem
et essayer d'obtenir des informations sur la mémoire.
Hmm... il semble que les résultats concernent toujours la mémoire virtuelle.