加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux 禁止单个中断

发布时间:2020-12-13 23:12:18 所属栏目:Linux 来源:网络整理
导读:有时(但是很少!)一个驱动需要禁止一个特定中断线的中断递交. 内核提供了 3 个函数为 此目的,所有都声明在 asm/irq.h. 这些函数是内核 API 的一部分,因此我们描述它 们,但是它们的使用在大部分驱动中不鼓励. 在其他的中,你不能禁止共享的中断线,并 且,在现代

有时(但是很少!)一个驱动需要禁止一个特定中断线的中断递交. 内核提供了 3 个函数为 此目的,所有都声明在 <asm/irq.h>. 这些函数是内核 API 的一部分,因此我们描述它 们,但是它们的使用在大部分驱动中不鼓励. 在其他的中,你不能禁止共享的中断线,并 且,在现代的系统中,共享的中断是规范. 已说过的,它们在这里:

?

void disable_irq(int irq);

void disable_irq_nosync(int irq); void enable_irq(int irq);

?

调用任一函数可能更新在可编程控制器(PIC)中的特定 irq 的掩码,因此禁止或使能跨所 有处理器的特定 IRQ. 对这些函数的调用能够嵌套 -- 如果 disable_irq 被连续调用 2 次,需要 2 个 enable_irq 调用在 IRQ 被真正重新使能前. 可能调用这些函数从一个中 断处理中,但是在处理它时使能你自己的 IRQ 常常不是一个好做法.

?

disable_irq 不仅禁止给定的中断,还等待一个当前执行的中断处理结束,如果有. 要知 道如果调用 disable_irq 的线程持有中断处理需要的任何资源(例如自旋锁),系统可能 死锁. disable_irq_nosync 与 disable_irq 不同,它立刻返回. 因此,使用 disable_irq_nosync 快一点,但是可能使你的设备有竞争情况.

?

但是为什么禁止中断? 坚持说并口,我们看一下 plip 网络接口. 一个 plip 设备使用裸 并口来传送数据. 因为只有 5 位可以从并口连接器读出,它们被解释为 4 个数据位和一 个时钟/握手信号. 当一个报文的第一个 4 位被 initiator (发送报文的接口) 传送,时 钟线被拉高,使接收接口来中断处理器. plip 处理者接着被调用来处理新到达的数据.

?

在设备已经被提醒了后,数据传送继续,使用握手线来传送数据到接收接口(这可能不是 最好的实现,但是有必要与使用并口的其他报文驱动兼容). 如果接收接口不得不为每个 接收的字节处理 2 次中断,性能可能不可忍受. 因此,驱动在接收报文的时候禁止中断; 相反,一个查询并延时的循环用来引入数据.

?

类似地,因为从接收器到发送器的握手线用来确认数据接收,发送接口禁止它的 IRQ 线 在报文发送时.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读