J'utilise l'instruction rdtscp
pour lire le registre ecx
pour détecter les ID de noeud cpu et numa (je développe un os).RDTSCP et ordre d'instruction
Le code ressemble à la
suivanteinline static long get(unsigned char *node_id = 0, unsigned char *cpu_id = 0)
{
unsigned int p;
__asm__ __volatile__("rdtscp\n" : "=c" (p) : : "memory");
if (node_id) {
*node_id = p >> 12;
}
if (cpu_id) {
*cpu_id = p & 0xfff;
}
return 0;
}
En utilisant cette fonction, j'ai un comportement incompréhensible: Le CPU me dit beaucoup d'exceptions (faute de page, faute de protection générale, ...). Cela m'indique, que l'identifiant de cpu ou de noeud n'est pas lu, mais si je consignation l'identification, tout semble juste et aucune exception n'apparaît.
donc dans le code:
// ...
unsigned char cpu, numa;
get(&numa, &cpu);
// use cpu and numa id creates exception
mais
// ...
unsigned char cpu, numa;
get(&numa, &cpu);
print(cpu); // <--- this makes cpu reading ok?
// use cpu and numa id is ok
est le cpu ReOrdering mes instructions, de sorte qu'il utilisera cpu_id/numa_id avant de le lire?
il semble que vous ne dites pas que le compilateur EAX et EDX sont aussi bien soient faussés. –
ouais, merci, ça l'a réparé! – jagemue
permettez-moi d'écrire rapidement une réponse ..... –