Chinaunix首页 | 论坛 | 博客
  • 博客访问: 61865
  • 博文数量: 19
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-12 11:10
个人简介

Stupid is as stupid does

文章分类

全部博文(19)

文章存档

2021年(1)

2017年(1)

2016年(17)

我的朋友

分类: LINUX

2016-05-17 14:32:06

软中断

软中断的一种典型应用就是所谓的"下半部"(bottom half),它的得名来自于将硬件中断处理分离成"上半部"和"下半部"两个阶段的机制:上半部在屏蔽中断的上下文中运行,用于完成关键性的处理动作;而 下半部则相对来说并不是非常紧急的,通常还是比较耗时的,因此由系统自行安排运行时机,不在中断服务上下文中执行。bottom half的应用也是激励发展出目前的软中断机制的原因。

概念

软中断是利用的概念,用软件方式进行模拟,实现宏观上的异步执行效果。很多情况下,软中断和"信号"有些类似,同时,软中断又是和硬中断相对应的,"硬中断是对CPU的中断","软中断通常是硬对内核的中断","信号则是由内核(或其他进程)对某个进程的中断"(《Linux内核源代码情景分析》第三章)。
软中断是linux系统原“底半处理”的升级,在原有的基础上发展的新的处理方式,以适应多cpu 、多线程的软中断处理。
软中断是实现系统API函数调用的手段
时将返回地址和CPU内容压栈,函数执行完毕后返回断点继续执行。
软中断调用时将返回地址和CPU状态寄存器内容压栈,修改,根据查找,找到ISR中断服务例程地址,跳转执行。
综上,函数调用和软中断调用的区别是,软中断多了修改特权级和查找中断向量表的功能,其他部分完全一样。
一般,系统程序由软件公司实现且不开源,你无法知道系统API函数的偏移地址,而且你写的应用程序和软件公司提供的系统程序是完全分开的,无法将二者链接在一起,同时,系统程序需要特权才能运行,此时用函数调用的办法是无法调用系统API函数的。解决这个问题的方法是使用软中断,当应用程序需要调用API时,就先设置功能号(如AX=0H),然后触发软中断(如INT 80H)。系统程序设置好。这样,应用程序就可以间接找到系统API了。
有了软中断,就可以实现应用程序的动态加载。就像WINDOWS/Linux那样,应用程序和系统程序分别开发,不在一起编译连接,应用程序通过软中断调用系统提供的功能。

代码的执行

Linux中的软中断机制用于系统中对时间要求最严格以及最重要的中断下 半部进行使用。在系统设计过程中,大家都清楚中断上下文不能处理太多的事情,需要快速的返回,否则很容易导致中断事件的丢失,所以这就产生了一个问题:中 断发生之后的事务处理由谁来完成?在前后台程序中,由于只有中断上下文和一个任务上下文,所以中断上下文触发事件,设置标记位,任务上下文循环扫描标记 位,执行相应的动作,也就是中断发生之后的事情由任务来完成了,只不过任务上下文采用扫描的方式,实时性不能得到保证。在Linux系统和Windows 系统中,这个不断循环的任务就是本文所要讲述的软中断daemon。在Windows中处理耗时的中断称之为中断延迟处理,在Linux中称之为中断下半部,显然中断上半部处理清中断之类十分清闲的动作,然后在退出时触发中断下半部,完成具体的功能。

在Linux中,中断下半部的实现基于软中断机制。所以理清楚软中断机制的原理,那么中断下半部的实现也就非常简单了。通过上述的描述,大家也应该清楚为 什么要定义软中断机制了,一句话就是为了要处理对时间要求苛刻的任务,恰好中断下半部就有这样的需求,所以其实现采用了软中断机制。

在Linux内核中,bottom half通常用"bh"表示,最初用于在特权级较低的上下文中完成中断服务的非关键耗时动作,现在也用于一切可在低优先级的上下文中执行的异步动作。


机制实现原理

软中断机制的实现原理如图所示:

软中断实现原理


核心元素

构成软中断机制的核心元素包括:
1、 软中断soft interrupt state(irq_stat)
2、 软(softirq_vec)
3、 软中断守护daemon
软中断的工作工程模拟了实际的过程,当某一软中断事件发生后,首先需要设置对应的中断标记位,触发中断事务,然后唤醒去检测中断状态寄存器,如果通过查询发现有软中断事务发生,那么通过查询软中断向量表调用相应的软中断服务程序action()。这就是软中断的过程,与唯一不同的地方是从中断标记到的映射过程。在CPU的硬件中断发生之后,CPU需要将硬件通过向量表映射成具体的服务程序,这个过程是硬件自动完成的,但是软中断不是,其需要守护线程去实现这一过程,这也就是软件模拟的中断,故称之为软中断。
一个软中断不会去抢占另一个软中断,只有硬件中断才可以抢占软中断,所以硬中断能够保证对时间的严格要求。

守护进程

守护线程一般指守护进程
或者操 作系统中在系统引导的时候会开启很多服务,这些服务就叫做守护进程。为了增加灵活性,root可以选择系统开启的模式,这些模式叫做运行级别,每一种运行 级别以一定的方式配置系统。 守护进程是脱离于终端并且在后台运行的进程。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端 信息所打断。
守护进程,也就是通常说的Daemon进程,是中 的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动, 在系统关闭时终止。Linux系统有很多守护进程,大多数服务都是通过守护进程实现的,同时,守护进程还能完成许多系统任务,例如,作业规划进程 crond、打印进程lqd等(这里的结尾字母d就是Daemon的意思)。
由于在Linux中,每一个系统与用户进行交流的界面称为终端,每一个从 此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。但是守护进程却能够突破这种 限制,它从被执行开始运转,直到整个系统关闭时才退出。如果想让某个进程不因为用户或终端或其他地变化而受到影响,那么就必须把这个进程变成一个守护进 程。

阅读(1333) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~