gpt4 book ai didi

linux-kernel - 不禁用中断处理程序(获取锁)中的本地中断如何导致双重获取死锁?

转载 作者:行者123 更新时间:2023-12-04 05:09:24 25 4
gpt4 key购买 nike

在 Linux Kernel Development book (Robert Love) 中,提到:

we must disable local interrupts before obtaining spinlock in interrupt handler. Otherwise it is possible for an interrupt handler to interrupt kernel code while the lock is held and attempt to re-acquire the lock. Which finally can lead to double-acquire deadlock.

现在我的疑问是:

  1. 一般来说,do_IRQ() 不是禁用本地中断吗?
  2. 如果获得锁,则意味着preempt_count 变量不为零,这使得其他处理程序不应该有机会,因为内核不是preempt_safe。那么其他中断处理程序如何在这种情况下工作?

最佳答案

首先,do_IRQ()函数并没有关闭本地中断,而是一些用汇编语言编写的函数关闭了,这就是中断入口。之后,在执行通过request_irq() 注册的中断函数之前,在函数handle_IRQ_event() 中也通过request_irq() 传递的标志是与IRQF_DISABLED比较,判断在执行中断函数时是否开启本地中断。因此,第一个问题的答案取决于您传递给 request_irq() 函数的标志。

其次,preempt_count 只是表示进程上下文中的内核抢占,而不是中断。为避免中断处理程序在 UP 中执行,唯一的方法是使用 irqs_disable()。当preempt_count为零时,表示内核可以安全地进行进程切换,否则不能。

关于linux-kernel - 不禁用中断处理程序(获取锁)中的本地中断如何导致双重获取死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22395248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com