深入理解Linux内核 学习笔记(4)
第四章 中断和异常
中断通常被分为同步中断和异步中断,
同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断
异步中断是由其他硬件设备依照CPU时钟信号随机产生的。
分别称为异常和中断,用中断信号指两者。
中断或异常处理执行的代码不是一个进程,而是内核控制路径,
中断满足尽快处理完、允许中断嵌套、临界区禁止
Intel文挡把中断和异常分为以下几类:
中断:
可屏蔽中断
被送到微处理器的INTR引脚。通过清eflag寄存器的IF标志关闭中断。所有I/O设备发出的IRQ均可引起可屏蔽中断。
不可屏蔽中断
被送到微处理器的NMI引脚。通过清IF标志,中断不能关闭。只有几个危急的事件,例如硬件故障,才引起不可屏蔽中断。
异常:
处理器探测异常
当CPU执行一条指令时所探测到的一个反常条件所产生的异常。可以进一步分为三组,这取决于CPU控制单元产生异常时保存在内核态堆栈eip寄存器的值:
故障
保存在eip中的值是引起故障的指令地址,只要处理程序能纠正引起异常的反常条件,会重新执行那条指令。
陷阱
陷阱的主要用途是为了调试程序。保存在eip中的值是一一个指令地址,该指令在引起陷阱的指令地址之后。只有当没有必要重新执行已执行过的指令时,才触发陷阱。
异常结束
发生一一个严重的错误。控制单元出了麻烦,不能在eip寄存器中保存有意义的值。异常结束是由硬件故障或系统表中无效的值引起的。由控制单元发送的这个中断信号是紧急信号,用来把控制切换到相应的异常结束处理程序,这个异常结束处理程序会迫使受影响的进程终止。
编程异常
在编程者发出请求时发生,是由int或int3指令触发的;当into (检查溢出)和bound(检香地址出界)指令检查的条件不为真时,也引起编程异常。控制单元把编程异常作为陷阱来处理。编程异常通常也被叫做软中断( software interrupt)。这样的异常有两种常用的用途:执行系统调用,或给调试程序通报一个特定的事件。
IRQ:
每个能发中断请求的硬件设备控制器都有一个IRQ的谁出线,
每个中断或异常有一个0~255的数,称为中断向量。0-31是异常和不可屏蔽中断,32-47是可屏蔽中断(IRQ),其余为软中断,linux只用了0x80来实现系统调用,用户态一条0x80切换进内核态,执行system_call内核函数。
大约有20种异常,每个异常对应一个专门的处理程序



中断,陷阱及系统门----三种类型的中断描述符
中断
用户态的进程不能访问的Intel的中断门(门的DPL域为0)。所有的中断处理程序都由中断门激活,并全部限制在内核态。
系统门
用户态的进程可以访问的Intel的陷阱门(门的DPL域为3)。通过系统门来激活四个Linux异常处理程序,它们的向量是3, 4, 5及128,因此,在用户态下,叮以发布int3、into、 bound及int 0x80 四条汇编指令。
陷阱门
用户态的进程不能访问Intel的陷阱门(门的DPL域为0)。除了前一段所描述的四个Linux异常处理程序,其他所有的异常处理程字都通过陷阱门来激活。
下列函数用来给 IDT插人门:
set_ intr_ gate (n, addr)
在第n个IDT表项中,插入一个中断门。这个门中的段描述符被设置成内核代码段的选择符,偏移域设置成addr,adar是中断处理程序的地址。把DPL域设置成0.
set_ system_ gate (n, addr) ,
在第n个IDT项中,插人一个陷阱门。这个门中的段描述符被设置成内核代码段的选择符,偏移域设置成addr,addr是异常处理程序的地址。把DPL城设置成3。
set_ trap_ gate (n, addr)
与前面的函数相似,只不过DPL的域被设置成0.
中断后要执行的操作有三类:
紧急的(Critical)
这样的操作诸如:向PIC 应答一个中断,对PIC或设备控制器重编程,或者修改由设备和处理器同时访问的数据结构。这些都能被很快地执行,而之所以说它们是紧急的是因为它们]必须被尽快地执行。紧急操作要在一一个中断处理程序内立即执行,而且是在关中断的状态下。
非紧急的(Noncritical )
这样的操作如,修改那些只有处理器才会访问的数据结构(例如,按下一个键后,读扫描码)。这些操作也要很快地完成,因此,它们由中断处理程序立即执行,但在开中断的状态下。
非紧急可延迟的(Noncritical deferrable )
这样的操作如,把一个缓冲区的内容拷贝到--些进程的地址空间(例如,把键盘行缓冲区的内容发送到终端处理程序的进程)。这些操作可能被延迟较长的时间间隔而不影响内核操作,有兴趣的进程会等待需要的数据。非紧急可延迟的操作由一些被称为“下半部分(botom half)"的函数来执行。我们将在后面讨论“下半部分”。
下半部分是-一个低优先级的函数,通常与中断处理相关,也就是说,等待内核找到一个方便的时刻来运行它。下半部分-直会等到下面事件之--发生时才会被执行:
内核处理完-一个系统调用。
内核处理完一个异常.
内核终止do_ IRQ() 函数,即处理完一个中断。
内核执行schedule{)函数以选择-一个新进程在CPU上运行。
下半部分与软中断:LINUX2.4之后引入了软中断,类似于2.2的下半部分,下半部分会严格串行执行(在不同CPU上也不会同时执行),软中断则不会
从中断和异常的返回
从技术上说,完成所有这些事情的内核汇编语言代码并不是一个函数,因为控制权从不返回到调用它的函数。它只是一个代码片段,有三个不同的入口点,分别叫做ret_ from_ intr、ret_ .from sys_ call和ret_ from exception。然而为了简单,我们常常以函数的形式提到下面这三个入口点:
ret_ from_ intr()
终止中断处理程序。
ret_ from_ sYs_ .cal1 ()
终止系统调用,即由0x80异常引起的内核控制路径。
ret_ from_ exception{)
终止除了0x80的所有异常。

深入理解Linux内核 学习笔记(4)的更多相关文章
- 深入理解Linux内核 学习笔记(1)
1.用户和用户组 每个用户是一个或多个用户组的一名成员,组由唯一的用户组标识符(user group ID)标识.每个文件的相关权限也恰好与一个组相对应. root为超级用户, 2.模块 为了达到微内 ...
- 深入理解Linux内核 学习笔记(5)
第五章 定时测量 内核必须显式地与三种时钟打交道:实时时钟(Real Time Clock, RTC).时间标记计数器(Time Stamp Counter, TSC)及可编程间隔定时器( Prog ...
- 深入理解Linux内核 学习笔记(3)
第三章 进程 可以看到很多熟悉的结构体 进程状态: 可运行状态(TASK_ RUNNING) 进程要么在CPU上执行,要么准备执行. 可巾断的等待状态(TASK_ INTERRUPTIBLE) 进程被 ...
- 深入理解Linux内核 学习笔记(2)
第二章 :内存寻址 略.基本同计算机组成原理中的讲述 内核代码和数据结构会存储在一个保留的页框中. 常规Linux安装在RAM物理地址0x00100000开始的地方.因为:页框0是由BIOS使用,存放 ...
- 深入理解Linux内核 学习笔记(8)
第八章 系统调用 API定义了一个给定的服务:系统调用是通过软中断向内核发出一个明确的请求. API可能不调用系统调用,也可能调用多个系统调用. Linux系统调用必须通过执行int 0x80,系统调 ...
- 20135316王剑桥Linux内核学习笔记
王剑桥Linux内核学习笔记 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的 个人理 ...
- Linux内核学习笔记-2.进程管理
原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- Linux内核学习笔记-1.简介和入门
原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- Linux内核学习笔记二——进程
Linux内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...
随机推荐
- RabbitMQ 安装 Your installed version of Erlang (6.2) is too old. Please install a more recent version.
windows安装RabbitMQ时在安装完Erlang语言开发包后,再安装RabbitMQ时报错: Your installed version of Erlang (6.2) is too old ...
- 软件性能测试技术树(二)----Linux服务器性能
全图: 测试目的: 测试范围&性能指标: 测试与生产环境服务器配置不同的处理方法: 实时CPU监控: 实时内存监控: 实时网络监控: 实时磁盘监控: 万能命令: Linux下的进程追踪命令: ...
- mysql在ubuntu中的操作笔记(详)
1.安装mysql客户端流程: - 登录navicat官网下载 - 将压缩包拷贝ubuntu中进行解压,解压命令:tar zxvf navicat.tar.gz - 进入解压目录,运行命令./s ...
- 关于Linux虚拟化技术KVM的科普 科普三(From OenHan)
http://oenhan.com/archives,包括<KVM源代码分析1:基本工作原理>.<KVM源代码分析2:虚拟机的创建与运行>.<KVM源代码分析3:CPU虚 ...
- 在Python中用Request库模拟登录(四):哔哩哔哩(有加密,有验证码)
!已失效! 抓包分析 获取验证码 获取加密公钥 其中hash是变化的,公钥key不变 登录 其中用户名没有被加密,密码被加密. 因为在获取公钥的时候同时返回了一个hash值,推测此hash值与密码加密 ...
- 写完批处理脚本,再写个Gradle脚本,解放双手
前言 上一篇写个批处理来帮忙干活---遍历&字符串处理中,我们已经学习如何写批处理脚本来帮我们做一些简单的重复性工作,本篇继续来学习如何用 Gradle 写脚本,让它也来帮我们干活 Gradl ...
- javascript 中的apply()和call()方法详解
1.语法 先来看看JS手册中对call的解释: call 方法 调用一个对象的一个方法,以另一个对象替换当前对象. call([thisObj[,arg1[, arg2[, [,.argN]]]]]) ...
- Java基础之抽象类
/* 1.抽象类的概述: 动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的. 我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须是抽象类. 抽象类的特点: A ...
- 玩转PHP(一)---php中处理汉字字符串长度:strlen和mb_strlen
注:本文为小编原创,如若转载,请注明出处:http://blog.csdn.net/u012116457/article/details/42536039 今天正式开始学习PHP了,不过小编一不小心就 ...
- windows命令中的cd
cd命令的作用为改变文件夹,也就是跳转目录.切换路径的意思.它后面可以接驱动器符号.完整路径和相对路径. 打开命令行窗口的时候,默认的目录位于当前用户所在的路径下,比如:C:\Users\koi\De ...