首页 文章

Mac OS X内核扩展CPU选择

提问于
浏览
3

我正在阅读英特尔性能计数器监视器(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上?如果不是,我担心以下故障情况:

  • cpu使用cpu_number()读取其数字id,确定它是正确的CPU,并开始读取MSR .

  • 线程被调度程序抢占并移动到其他CPU .

  • 读取MSR,但现在从不同的CPU读取,从而给出错误的值 .

1 回答

  • 2

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

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

相关问题