armv8+linux4.19环境
举个例子:进程A中调用了spin_lock(&lock)然后进入临界区,此时来了一个中断(interrupt),
该中断也运行在和进程A相同的CPU上,并且在该中断处理程序中恰巧也会spin_lock(&lock)
试图获取同一个锁。由于是在同一个CPU上被中断,进程A会被设置为TASK_INTERRUPT状态,
中断处理程序无法获得锁,会不停的忙等,由于进程A被设置为中断状态,schedule()进程调度就
无法再调度进程A运行,这样就导致了死锁!
spin_lock
==> raw_spin_lock
==> _raw_spin_lock
==> __raw_spin_lock
==> preempt_disable
spin_acquire
do_raw_spin_trylock ==> queued_spin_lock
spin_lock_irqsave
==> raw_spin_lock_irqsave
==> _raw_spin_lock_irqsave
==> __raw_spin_lock_irqsave
==> local_irq_save ==> msr daifset, #2
preempt_disable
spin_acquire
do_raw_spin_lock ==> queued_spin_lock
arm64接收到中断后由中断向量VBAR寄存器设置的地址开始执行异常处理代码,
中断触发时,硬件自动对PSR的daif异常标志mask了,待中断完成返回后自动恢复
el1_irq ==> enable_da_f 只使能了Debug、SError和 firq中断,未对irq中断打开 即中断处理中禁止中断嵌套
周期调度器因为无法来timer中断,得不到调度被interrupt的进程,同时也关闭了抢占,所以当前cpu死锁