Mac OS X内核扩展CPU选择

时间:2013-05-09 20:19:03

标签: kernel kernel-module mach

我正在阅读英特尔性能计数器监视器(http://software.intel.com/en-us/articles/intel-performance-counter-monitor-a-better-way-to-measure-cpu-utilization)附带的模型特定寄存器(MSR)驱动程序内核扩展的源代码。由于MSR /性能计数器的独立副本存储在不同的CPU上,因此需要指定要读取的CPU。这可以通过调用 mp_rendezvous_no_intrs 函数来完成。

mp_rendezvous_no_intrs(cpuReadMSR, (void*)idatas);

这会导致每个处理器检查它是否是正确的处理器编号,如果是,则从MSR读取数据:

void cpuReadMSR(void* pIData){
    pcm_msr_data_t* data = (pcm_msr_data_t*)pIData;
    volatile uint cpu = cpu_number();
    if(data->cpu_num == cpu)
    {
        data->value = RDMSR(data->msr_num);
    }
}

我的问题是:是否关闭中断(通过mp_rendezvous_no_intrs这样做)足以使运行cpuReadMSR函数的线程始终保持在同一个CPU上?如果不是,我担心以下故障情况:

  1. cpu使用cpu_number()读取其数字id,确定它是正确的CPU,并开始读取MSR。
  2. 线程被调度程序抢占并移动到其他CPU。
  3. 读取MSR,但现在从不同的CPU读取,从而给出错误的值。

1 个答案:

答案 0 :(得分:2)

禁用中断会禁用所有中断,而不仅仅是其中一些中断。这包括定时器中断,这通常允许运行的线程被抢占。

虽然中断被禁用,但没有任何东西(没有像CPU异常那样疯狂)可以在单个CPU上中断代码从运行,开始到结束。