我正在阅读英特尔性能计数器监视器(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上?如果不是,我担心以下故障情况:
答案 0 :(得分:2)
禁用中断会禁用所有中断,而不仅仅是其中一些中断。这包括定时器中断,这通常允许运行的线程被抢占。
虽然中断被禁用,但没有任何东西(没有像CPU异常那样疯狂)可以在单个CPU上中断代码从运行,开始到结束。