在定时器中断下锁定/解锁互斥锁

时间:2018-04-10 17:27:55

标签: linux-kernel kernel linux-device-driver

在计时器处理程序(内核空间)中锁定互斥锁是否安全? 我有两个内核模块可以读/写同一个I2C设备: - 第一个模块:加载时启动计时器。每20 ms在定时器处理程序下读取I2C寄存器 - 第二个模块:读/写相同的I2C寄存器

我看到很多内核崩溃(CPU 1被冻结) - >我怀疑当尝试在计时器处理程序下解锁互斥锁时,内核会冻结你能确认吗?

1 个答案:

答案 0 :(得分:0)

中断处理程序不应使用互斥锁进行锁定。这是因为如果ISR外部的任何代码试图保持互斥锁,但在完成该操作之前,ISR执行然后尝试保持ISR,它可能会崩溃,因为互斥锁将处于不确定的形式

为什么我不能使用互斥锁,如果我只从ISR锁定而不是从外部锁定?

Mutexes是为线程应用程序设计的,一个线程可以阻塞,直到另一个在关键部分。由于您的ISR不可阻止,即您无法暂停,因为ISR本身必须及时返回IRET

我应该在ISR中使用什么锁定机制?

自旋锁在ISR中通常更安全。但是在锁定和解锁时,你必须确保使用原子原语,以便ISR无法介入,并在被其他东西锁定时尝试获取锁。

您也可以使用简单的RW锁定,读者可以同时使用。当作家进入时,它会等待所有读者退出,并且会通过不放开锁定来阻止任何传入的读者。