禁用所有中断以保护多处理器系统上的CPU寄存器状态

时间:2011-02-09 10:48:10

标签: linux-kernel multicore interrupt spinlock

我需要确保代码部分(在内核模式下)没有其他人可以修改/检查CR0寄存器。在单处理器系统上,我认为禁用中断是最好的。但是在多处理器系统上:

  • 有没有办法在代码段中禁用所有处理器的所有中断(例如使用自旋锁机制)?

  • 这有必要吗?修改多处理器系统上的cr0寄存器时,我想只修改当前CPU的寄存器? - >所以只为当前的CPU禁用中断就足够了吗? - >有没有办法检查/修改来自其他CPU的CPU(在同一系统上)?

非常感谢你的回答(对我的近似英语抱歉)

杰罗姆。

2 个答案:

答案 0 :(得分:1)

杰罗姆,

您是否考虑过使用spin_lock_irqsave()spin_unlock_irqrestore()?这会禁用本地中断。

我认为更全面的版本是spin_lock_irq()spin_unlock_irq(),它会无条件地停止所有中断(例如cli()/sti())。

使用这些锁定机制时需要考虑许多条件。其中一个主要示例是在sleep内部失去调用可能spin_lock的内核函数的能力。在确定哪种情况最适合您的特定情况之前,您可能需要进行一些研究。但是从你提供的简短解释来看,上面两个方案中的一个似乎对你有用。

祝你好运!

答案 1 :(得分:0)

你在那里问了很多问题,我会尝试按顺序回答:

通常没有一种简单的方法可以禁用代码段周围所有处理器上的所有中断。但你很少需要这样做。在大多数情况下,您只需要防止代码在另一个CPU上执行,并防止当前CPU上的中断。这可以通过spin_lock_irqsave()来实现。

要修改寄存器,通常不需要进行任何锁定,可以自动修改寄存器。如果要修改寄存器,执行某些操作,然后再更改寄存器,则可能需要禁用该序列周围的中断。

通常,无法查看系统中其他CPU的寄存器。内核的方式是让另一个CPU将其寄存器存储到内存中。

要警惕的一点是,在现代CPU上,某些寄存器可能是每个核心,即。在核心上的多个线程之间共享。

最后我假设您在x86上讨论CR0。这不像修改任何旧的寄存器,你需要真正知道你在做什么: - )