Kernel Mac OS X内核扩展CPU选择

Kernel Mac OS X内核扩展CPU选择,kernel,kernel-module,mach,Kernel,Kernel Module,Mach,我正在阅读英特尔性能计数器监视器()附带的型号特定寄存器(MSR)驱动程序内核扩展的源代码。由于MSRs/性能计数器的独立副本存储在不同的CPU上,因此有必要指定从哪个CPU读取。这是通过调用mp\u rendezvous\u no\u intrs函数来完成的 mp_rendezvous_no_intrs(cpuReadMSR, (void*)idatas); 这会导致每个处理器检查其是否为正确的处理器编号,如果是,则从MSR读取数据: void cpuReadMSR(void* pIData

我正在阅读英特尔性能计数器监视器()附带的型号特定寄存器(MSR)驱动程序内核扩展的源代码。由于MSRs/性能计数器的独立副本存储在不同的CPU上,因此有必要指定从哪个CPU读取。这是通过调用mp\u rendezvous\u no\u 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读取,因此给出了错误的值

  • 禁用中断将禁用所有中断,而不仅仅是其中的一部分。这包括计时器中断,这通常允许抢占正在运行的线程


    当中断被禁用时,任何东西(除了像CPU异常这样疯狂的东西)都不能在单个CPU上中断代码的运行,从开始到结束。

    这是当今的理论。。。与普通中断路由/屏蔽子系统一样,[IO]APIC可编程为创建任何x86陷阱(该字专门选择…256个中断向量中的任意一个,其中32个为陷阱,其中一个显式命名为NMI-不可屏蔽中断)。禁用CPU级别的中断(
    cli
    instruction)不会关闭陷阱,因此,如果IOAPIC的配置是这样的,则不会禁用对32个编号较低的中断向量的硬件中断调度。简而言之:现在很难在x86 CPU上“禁用中断”。。。操作系统需要帮助您完成“在不发生中断的情况下[在所有CPU上]运行此代码”的任务。这是因为这样做需要一个复杂的设置——对APIC进行编程以阻止中断,以及在没有处理器间中断的情况下进行CPU渲染,以及屏蔽所有可能的NMI源。