2014-01-28 66 views
4

我可以讀/寫一個MSR寄存器,但我不知道如何指定應該運行哪個內核的MSR。如何讀取特定內核(性能計數器)寄存器?

例如,我想分別記錄每個核心的L2私有緩存未命中,所以我需要指定每個核心的核心ID。

我知道smp_call_function()來調用所有核心上的代碼。如果我添加一個insn來記錄這個代碼正在運行的核心ID並使用smp_call_function(),它應該可以工作。但是如果我只想知道核心1的L2私有緩存未命中,我將不得不讓所有內核記錄這個數字,這對我來說並不是很好。

有沒有更好的解決方案呢?

我的讀/寫操作MSR代碼:

mov $0x0001010E, %eax    # Write selector value to EAX 
    xor %edx, %edx      # Zero EDX 
    mov $0x187, %ecx      # Write logical register id to ECX (IA32_PERFEVTSEL1) 
    wrmsr 

    mov $0xc2, %ecx      # Address of MSR IA32_PMC1 
    rdmsr        # Read value into EAX:EDX (EAX contains low-order bytes) 

回答

3

使用smp_call_function_single到一個特定的CPU上運行代碼。

+0

非常感謝!我認爲它必須工作! :) – Mike