当中断到来时,内核如何处理进程上下文中的锁?

时间:2014-02-07 05:45:45

标签: linux-kernel kernel

首先抱歉问题中有点含糊不清......我想了解的是以下情况

假设porcess正在运行,它持有一个锁,现在在获取锁之后产生HW中断,那么内核如何处理这种情况,它会等待锁吗?如果是,如果中断处理程序需要访问该锁或受进程中该锁保护的共享数据该怎么办?

2 个答案:

答案 0 :(得分:1)

Linux内核有一些用于获取自旋锁的功能,可以处理你在这里提出的问题。特别是,有spin_lock_irq(),它禁用中断(在进程运行的CPU上)并获取自旋锁。当代码知道在获取自旋锁之前启用了中断时,可以使用此功能。如果可以在不同的上下文中调用该函数,还有spin_lock_irqsave(),它会在禁用它们之前将当前的中断状态存储起来,以便spin_unlock_irqrestore()可以重新启用它们。

在任何情况下,如果在进程和中断上下文中都使用了锁(如果有需要在上下文之间共享的数据,那么这是一个很好且非常常见的设计),那么进程上下文必须禁用中断(本地开启)获取螺旋锁以避免死锁时运行的CPU。事实上,lockdep(“CONFIG_PROVE_LOCKING”)将验证这一点,并警告是否以易受“中断而进程上下文持有锁定”死锁的方式使用自旋锁。

答案 1 :(得分:0)

让我解释一下中断处理程序或下半部分的一些基本属性。

  1. 处理程序无法与用户空间之间传输数据,因为它不会在进程的上下文中执行。
  2. 处理程序也无法执行任何可以休眠的操作,例如调用wait_event,使用GFP_ATOMIC之外的任何内容分配内存,或者锁定信号量
  3. 处理程序无法调用计划。
  4. 我想说的是中断处理程序在原子上下文中运行。他们无法入睡,因为他们无法重新安排。中断没有支持流程上下文

    以上是设计的。您可以在代码中执行任何操作,只需为后果做好准备

    让我们假设你在中断处理程序中获得了一个锁(糟糕的设计)。 当发生中断时,进程将其寄存器保存在堆栈中并启动ISR。在获得锁定之后,你将陷入僵局,因为ISR无法知道进程在做什么。

    在使用ISR完成此过程之前,该过程将无法继续执行

    在抢占式内核中,ISR和进程可以抢占先机,但对于非抢占式内核,你已经死了。