ecx
レジスタを読み取ってCPUとNUMAノードのIDを検出するために命令を使用しています(私はosを開発中です)。RDTSCPと命令命令
コードは、この機能を使用するには、以下の
inline 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;
}
のように見える、私は理解できない行動を持っている:CPUは私に例外(ページフォルト、一般保護違反、...)の多くを伝えます。つまり、CPUまたはノードIDは読み取られませんが、IDを記録するとすべてが正しいように見え、例外も表示されません。コード中のSO
:彼はそれを読む前にCPU_ID/numa_idを使用するように
// ...
unsigned char cpu, numa;
get(&numa, &cpu);
// use cpu and numa id creates exception
しかし
// ...
unsigned char cpu, numa;
get(&numa, &cpu);
print(cpu); // <--- this makes cpu reading ok?
// use cpu and numa id is ok
は、私の指示を並べ替えるCPUですか?
これは、eaxとedxも同様にコンパイラーに通知していないようです。 –
ええ、ありがとう、それを修正! – jagemue
私はすぐに答えを書くことができます..... –