2017-07-06 7 views
2

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ですか?

+2

これは、eaxとedxも同様にコンパイラーに通知していないようです。 –

+0

ええ、ありがとう、それを修正! – jagemue

+0

私はすぐに答えを書くことができます..... –

答えて

2

レジスタeaxとedxがclobberedであることをコンパイラに伝えます。 clobbered listに追加してください:

__asm__ __volatile__("rdtscp\n" : "=c" (p) : : "memory", "eax", "edx"); 
+1

なぜここで「記憶」が壊れていますか?この命令はメモリを壊さない。 Intelの方言が指定されていると仮定していると思います( '-masm = intel');これは別の方法では動作しないので、明示的に呼び出す価値があります。 –