4

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

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

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

非常感谢您的回答(对不起我的近似英语)

杰罗姆。

4

2 回答 2

2

杰罗姆,

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

我相信一个更包罗万象的版本是无条件spin_lock_irq()spin_unlock_irq()停止所有中断(如cli()/sti())。

使用这些锁定机制时需要考虑许多条件。一个主要的例子是失去调用内核函数的能力,这些函数可能sleep在你的spin_lock. 您可能需要进行一些研究,然后才能确定哪种方法最适合您的特定情况。但是从您提供的简短解释看来,上述两种方案中的一种应该适合您。

祝你好运!

于 2011-02-09T14:55:52.583 回答
1

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

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

要修改寄存器,您通常不需要进行任何锁定,您可以原子地修改寄存器。如果您想修改寄存器,做某事,然后将寄存器改回来,那么您可能需要禁用该序列周围的中断。

一般来说,没有办法看到系统中另一个 CPU 的寄存器。内核这样做的方式是要求其他 CPU 将其寄存器存储到内存中。

需要注意的一件事是,在现代 CPU 上,某些寄存器可能是每个内核的,即。在一个核心上的多个线程之间共享。

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

于 2011-02-10T12:37:05.607 回答