2
我正在使用rdtscp
指令讀取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,一切似乎都正確,並且不會出現異常。
,這樣,代碼:
// ...
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重新排序我的指示,讓他將使用CPU_ID/numa_id之前讀它?
好像你不告訴編譯器eax和edx也被破壞了。 –
是的,謝謝,修復它! – jagemue
讓我快點寫一個答案..... –