要理解 spin_lock_irqsave
的中断上下文保护作用,需要结合中断的运行机制以及可能出现的问题来详细说明。以下是详细讲解:
1. 中断和中断上下文
什么是中断?
- 中断是一种硬件或软件机制,用于在特定事件发生时打断当前正在执行的代码,切换到中断服务程序(Interrupt Service Routine, ISR)以处理该事件。
- 中断分为硬件中断和软件中断,通常硬件中断由外设触发,例如网卡、定时器等。
中断上下文
- 中断处理程序运行在特殊的上下文中,称为中断上下文:
- 没有用户态进程对应的上下文。
- 不能睡眠或阻塞(例如,不能调用可能睡眠的函数)。
- 通常运行在高优先级,优先于普通线程。
2. 为什么中断与自旋锁可能冲突?
假设一个共享资源 xdev->flags
在以下两种上下文中被访问:
- 普通线程上下文:主线程在
probe_one
中使用spin_lock
对资源加锁并修改。 - 中断上下文:设备触发中断,中断处理程序也试图访问
xdev->flags
。
问题:
- 假如普通线程上下文已经持有了自旋锁(
spin_lock
),并且当前中断发生在同一个 CPU 上:- 中断处理程序会试图获取同一个锁,但因为锁已被持有,它会陷入自旋等待。
- 然而,普通线程被中断阻塞,无法释放锁,导致死锁。