Linux内核之中断的本质是轮询?

Linux内核之中断的本质是轮询?_第1张图片

01 写在前面的话

前段时间在研究触摸屏驱动,触摸屏驱动涉及到一个很基础的内核知识:中断。虽然中断这个词已经非常没有新意了,而且网上资料一搜一大把。在这么多资料中鄙人万花丛中过,依然决定现身说法讲讲中断一二事,或者说探讨一下中断是不是就是轮询。

02 先来点理论

中断,顾名思义,就是打断正在进行中的工作。 我们知道linux管理所有的硬件设备,要做的第一件事是处理器与硬件设备的通信。说的简单,怎么实现呢?简单一点,轮询(polling)可能就是一种解决方法,缺点是操作系统要做太多的无用功,在那里傻傻的做着不重要而要重复的工作。这里有更好的办法—中断,关键在于从硬件设备的角度上看,已经实现了化被动为主动的历史性突破,谁都不喜欢被动,对吧。
中断,本质上是一种电信号,当硬件设备有某种事件发生时就会产生中断信号,由硬件设备把信号发送给处理器(中间还有一个中断控制器,在此不细说),处理器接收到中断后,会马上向操作系统反应此信号的到来,然后就由OS负责处理这些新到来的数据,中断可以随时发生,不用操心与处理器的时间同步问题。
不同的设备对应的中断不同,他们之间的不同从操作系统级来看,差别就在于“中断号”,专业一点就叫中断请求(IRQ)线,通常IRQ都是一些数值。有些体系结构上,中断号是固定的,有的是动态分配的,特定的中断总是与特定的设备相关联,并且内核是需要知道这些信息的。

03 中断等于轮询?

聊到这里,我想无论如何大家对中断都已经形成概念了,虽然还有同步/异步中断,硬/软中断、中断嵌套,设备驱动代码中断相关接口的使用等很多知识未涉及,但是我现在迫不及待想和大家讨论下中断是不是轮询这个问题了。

你可能会说:这不明摆着的吗,中断怎么可能是轮询,中断是打断是被接受!与轮询是完全对立的才对啊!嗯,你说的都对!

以前查阅各种关于中断的资料时都会将“轮询”作为反面教材。年轻时候没在意,而且开发软件的也不需要关注这么深,觉得轮询与中断本应就是对立的,嗯,没毛病!

轮询(polling)是不是意味着主动,并且需要重复check?ok,是的、需要。那么问题来了:当外界发生中断时,中断信号经过中断控制器,最终达到CPU的中断引脚,这个信号会修改中断寄存器,然后CPU本身是如何知道中断发生的???

Linux内核之中断的本质是轮询?_第2张图片
鲁迅曾今说过:当我感觉困惑的时候一定是书读少了!于是翻出我的砖头,哦不,打开我知识的宝库:《深入理解linux内核》,打开中断和异常这一章节,其中有一段话是这么描述的:

……

当执行了一条指令后,cs和eip这对寄存器包含了下一条将要执行的指令的逻辑地址。在处理那条指令之前,控制单元会检查在运行前一条指令时是否已经发生了一个中断或异常,如果发生了一个中断或异常,那么控制单元执行下列操作:

……
——《深入理解linux内核》

这里介绍下书本中提到的异常,我们可以简单理解为中断的一种:同步中断。

看,标粗的这一句就是重点,中断也是需要CPU check的!也就是说:处理器在每个指令周期都会去查看中断寄存器,如果中断寄存器有效,也就是发生了中断,那么cpu会执行一系列与中断相关的操作。于是有人就说:“那么是否可以这么讲,中断的本质其实就是轮询,只是比直接在代码中轮询的效率高,反应快?”

探讨到这里你是不是也觉得中断和轮询并不是完全对立的两个概念?嗯,最终的结论:中断和轮询它俩是对立统一的,至少我是这么认为的!

欢迎留言讨论,同时有兴趣的朋友可以关注微信公众号:麻辣软硬件,精彩内容不要错过哦!关注后直接在微信后台回复“内核资料”,即可领取linux内核的一些学习资料,谢谢!
Linux内核之中断的本质是轮询?_第3张图片

你可能感兴趣的:(Linux内核之中断的本质是轮询?)