《Linux内核设计与实现》笔记(七)

(七)中断和中断处理

由我们来提供一种机制,让硬件在需要的时候向内核发出信号,这就是中断机制。

中断

中断本质上是一种特殊的电信号,由硬件设备发向处理器。处理器接收到中断后,会马上向操作系统反映此信号的到来,然后就由操作系统负责处理这些新到来的数据。

中断控制器是个简单的电子芯片,其作用是将多路中断管线采用复用技术只通过一个和处理器相连接的管线与处理器通信。当接收到一个中断后,中断控制器会给处理器发送一个电信号,处理器一经检测到此信号,便中断自己的当前工作转而处理中断。此后,处理器会通知操作系统已经产生中断,这样操作系统就可以对这个中断进行适当的处理了。

不同的设备对应的中断不同,例如来自键盘的中断就有别于来自硬盘的中断;而每个中断都通过一个唯一的数字标志。

中断与异常:
中断是由硬件产生的异步中断,而异常是由处理器本身产生的同步中断;
异常与中断不同,它在产生时必须考虑与处理器时钟同步;
异常也常常被称为同步中断。

中断处理程序

在响应一个特定中断的时候,内核会执行一个函数,该函数叫做中断处理程序或中断服务例程。产生中断的每个设备都有一个相应的中断处理程序,一个设备的中断处理程序是它设备驱动程序的一部分————设备驱动程序是用于对设备进行管理的内核代码。(中断处理程序通常不是和特定设备关联,而是和特定中断关联的,也就是说,如果一个设备可以产生多种不同的中断,那么该设备就可以对应多个中断处理程序,相应的,该设备的驱动程序也就需要准备多个这样的函数)

中断处理程序是被内核调用来响应中断的,而它们运行于我们称之为中断上下文的特殊上下文中,该上下文中的执行代码不可阻塞。

上半部与下半部的对比

又想中断处理程序运行得快,又想中断处理程序完成的工作量多,我们一般把中断处理切为两个部分或两半。中断处理程序是上半部————接收到一个中断,它就立即开始执行,但只做有严格时限的工作,例如对接收的中断进行应答或复位硬件,这些工作都是在所有中断被禁止的情况下完成的。能够被允许稍后完成的工作会推迟到下半部去,此后在合适的时机,下半部会被开中断执行。

编写中断处理程序

Linux中的中断处理程序是无须重入的。当一个给定的中断处理程序正在执行时,相应的中断线在所有处理器上都会被屏蔽掉,以防止在同一中断线上接收另一个新的中断。通常情况下,所有其他的中断都是打开的,所有这些不同中断线上的其他中断都能被处理,但当前中断线总是被禁止的。由此可以看出,同一个中断处理程序绝对不会被同时调用以处理嵌套的中断。

中断上下文

中断上下文与进程上下文
进程上下文:进程上下文是一种内核所处的操作模式,此时内核代表进程执行————例如,执行系统调用或运行内核线程。在进程上下文中,可以通过current宏关联当前进程。此外,因为进程是以进程上下文的形式连接到内核中的,因此,进程上下文可以睡眠,也可以调用调度程序。
中断上下文:中断上下文和进程并没有什么瓜葛。与current宏也是不相干的。因为没有后备进程,所以中断上下文不可以睡眠,否则不能再对它重新调度,因此不能从中断上下文中调用某些会睡眠的函数。

中断程序打断了其他的代码,正是因为这种异步执行的特性,所以所有的中断处理程序必须尽可能的迅速、简洁。尽量把工作从中断处理程序中分离出来,放在下半部来执行,因为下半部可以在更合适的时间运行。

中断处理机制的实现

中断从硬件到内核的路由:设备产生中断,通过总线把电信号发送给中断控制器。如果中断线是激活的(它们允许被屏蔽),那么中断控制器就会把中断发往处理器。在大多数体系结构中,这个工作就是通过电信号给处理器的特定管脚发送一个信号。除非在处理器上禁止该中断,否则处理器会立即停止它正在做的事,关闭中断系统,然后跳到内存中预定义的位置开始执行那里的代码。这个预定义的位置是由内核设置的,是中断处理程序的入口点。

初始入口点只是在栈中保存了所接收中断的IRQ号,并存放当前寄存器的值,然后内核调用函数do_IRQ()。

中断控制

Linux内核提供了一组接口用于操作机器上的中断状态。这些接口为我们提供了能够禁止当前处理器的中断系统或屏蔽掉整个机器的一条中断线的能力。

通过禁止中断,可以确保某个中断处理程序不会抢占当前的代码,此外还可以禁止内核抢占。

锁提供保护机制,防止来自其他处理器的并发访问,而禁止中断提供保护机制,则是防止来自其他中断处理程序的并发访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值