1、中断的作用:中断信号提供了一种方式,使处理器转而去运行正常控制流之外的代码。当一个中断信号到达时,CPU必须停止它当前所做的事,并切换到一个新的活动。为了做到这一点,就要在内核态堆栈保存程序计数器的当前值(即eip和cs寄存器的内容),并把与中断类型相关的一个地址放进程序计数器。

2、异常又分为三种类型:

(1)、故障(Fault):保存在eip中的值是引起故障的指令地址,因此,当异常处理程序终止时,会重新执行该指令。(例如,缺页异常处理程序)。

(2)、陷阱(Trap):保存在eip中的值是引起陷阱的指令之后的指令。主要用于调试程序。

(3)、异常结束(Abort):发生严重错误,不能在eip中保存有意义的值。一般由硬件故障引起,只能迫使受影响的进程终止。

3、IRQ和中断:每个能够发出中断请求的硬件设备控制器都有一个指派为IRQ(Interrupt ReQuest)的输出线。所有现有的IRQ线都与一个叫做中断控制器的硬件电路的输入引脚相连,中断控制器执行以下动作:

  1. 监视IRQ线,检查产生的信号
  2. 如果在IRQ线上产生一个信号:
    1. 把接收到的信号转换成一个对应的向量
    2. 把这个向量存放在中断控制器的I/O端口,从而允许CPU通过数据总线读此向量
    3. 把产生的信号发送到处理器的INTR引脚,即发出一个中断
    4. 等待,直到CPU确认这个中断信号,把它写进可编程中断控制器(PIC)的其中的一个IO端口,同时,清INTR线

  3. 返回第一步

4、被禁用的中断是丢失不了的,它们一旦变为允许,PIC就又把被禁用的中断发送到CPU。这个特点被大多数中断处理程序所使用,因为这允许中断处理程序连续地处理同一类型的IRQ。

5、当eflags寄存器的IF标志被清除时,由PIC发布的可屏蔽中断被CPU临时忽略。cli和sti汇编指令分别清除和设置该标志。

6、中断描述符表(Interrupt Descriptor Table,IDT)包含了三种类型的描述符:任务门(Task gate),中断门(Interrupt gate)和陷阱门(Trap gate)。中断门中包含了段选择符和一个中断或异常处理程序的段内偏移。当控制器转入一个适当的段时,处理器清IF标志,从而关闭接下来会发生的可屏蔽中断。Linux用中断门处理中断,用陷阱门处理异常。

7、当发生中断或异常时,控制单元将:

  1. 根据中断或异常的向量i,访问idtr和gdtr寄存器,找到中断或异常处理程序所在段的基地址和偏移。
  2. 权限检查,要求中断处理程序的特权不能低于引起中断的程序的特权,即gdtr指向的段描述符的DPL不能大于CPL。如果是编程异常,则要求处于IDT中的门描述符的DPL要小于CPL,这能防止用户应用进程访问特殊的陷阱门或中断门。
  3. 若发生了特权级的变化,控制单元必须开始使用与新的特权级相关的栈,通过访问当前进程的TSS段,获取正确的ss和esp值,并且在新的栈中保存ss和esp以前的值。
  4. 如果故障已经发生,则用引起异常的指令地址装载cs和eip,从而使得该指令能再次被执行。保存eflag, cs以及eip的内容,如果异常产生了一个硬件错误码,将它保存在栈中。
  5. 根据IDT表中的第i项门描述符的段选择符和偏移装载cs和eip

中断或异常被处理完成之后,相应的处理程序必须产生一条iret指令,把控制权转交给被中断的进程,这将导致控制单元:

  1. 用堆栈中的值装载cs, eip和eflag,如果一个硬件错误码被压入栈中,并且在eip内容的上面,那么在执行iret指令前必须先弹出这个硬件错误码。
  2. 检查处理程序的CPL是否等于cs中的最低两位的值。如果是,iret终止执行,否则转入下一步
  3. 从栈中装载ss和esp,返回到与旧特权级相关的栈。
  4. 检查ds,es,fs和gs段寄存器的内容,如果其中的一个寄存器包含的选择符是一个段描述符,并且其DPL小于CPL,那么清相应的段寄存器。这么做的原因是防止用户态的程序利用内核以前使用的段寄存器来访问内核地址空间。

8、当CPU正在执行一个与中断有关的内核控制路径时,Linux的设计不允许发生进程切换。但是,这样的内核控制路径可以随意嵌套,即一个中断处理程序可以由另一个中断处理程序进行中断。

9、当一个中断处理程序正在运行时,相应的IRQ线上再发出的信号就被忽略。更重要的是中断处理程序是代表进程执行的,它所代表的进程必须总处于TASK_RUNNING状态,否则可能出现系统僵死情形,并且中断处理程序不能执行任何阻塞过程。

10、所有的中断处理程序执行四个相同的基本操作:

  1. 在内核态堆栈中保存IRQ的值和寄存器的内容
  2. 为正在给这个IRQ线服务的PIC发送一个应答,这将允许PIC进一步发出中断
  3. 执行共享这个IRQ的所有设备的中断服务例程(ISR)
  4. 跳到ret_from_intr()的地址后终止

-----------------------------------------------------------------补充-----------------------------------------------------

1、In order to ensure that these protected control transfers are actually protected, the processor's interrupt/exception mechanism is designed so that the code currently running when the interrupt or exception occurs does not get to choose arbitrarily where the kernel is entered or how.

2、The Task State Segment.When an x86 processor takes an interrupt or trap that causes a privilege level change from user to kernel code, it also switches to a stack in the kernel's memory.A structure called the task state segment(TSS) specifies the segment selector and address where this stack lives.The processor pushes (on the new stack)SS, ESP, EFLAGS, CS, EIP, and an optional error code.Then it loads the CS and EIP from the interrupt descriptor, and sets the ESP and SS to refer to the new stack.

3、Nested Exceptions and Interrupts.只有当从用户态进入内核态时,x86处理器才会自动切换stack,并压入old registers以及调用IDT中指定的exception handler。当处理器已经处于内核态时,CPU并不切换stack,只是将必要的内容入栈。

《深入理解Linux内核》阅读笔记 --- 第四章 中断和异常的更多相关文章

  1. 深入理解Linux内核 学习笔记(4)

    第四章 中断和异常 中断通常被分为同步中断和异步中断,同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断异步中断是由其他硬件设备依照CPU时 ...

  2. 深入理解Linux内核 学习笔记(3)

    第三章 进程 可以看到很多熟悉的结构体 进程状态: 可运行状态(TASK_ RUNNING) 进程要么在CPU上执行,要么准备执行. 可巾断的等待状态(TASK_ INTERRUPTIBLE) 进程被 ...

  3. 深入理解Linux内核 学习笔记(5)

    第五章  定时测量 内核必须显式地与三种时钟打交道:实时时钟(Real Time Clock, RTC).时间标记计数器(Time Stamp Counter, TSC)及可编程间隔定时器( Prog ...

  4. 深入理解Linux内核 学习笔记(1)

    1.用户和用户组 每个用户是一个或多个用户组的一名成员,组由唯一的用户组标识符(user group ID)标识.每个文件的相关权限也恰好与一个组相对应. root为超级用户, 2.模块 为了达到微内 ...

  5. 鸟哥的Linux私房菜笔记第四章

    前言 对着<鸟哥的Linux私房菜-基础版>做了简化笔记.不想让自己知其然而不知其所然.所以写个博客让自己好好巩固一下,当然不可能把书中的内容全部写下来.在这里就简化一点把命令写下来. 让 ...

  6. 深入理解 C 指针阅读笔记 -- 第五章

    Chapter5.h #ifndef __CHAPTER_5_ #define __CHAPTER_5_ /*<深入理解C指针>学习笔记 -- 第五章*/ /*不应该改动的字符串就应该用 ...

  7. 【深入理解Linux内核架构】第3章:内存管理

    3.1 概述 内存管理涵盖了许多领域: 内存中物理内存页的管理: 分配大块内存的伙伴系统: 分配小块内存的slab.slub.slob分配器: 分配非连续内存块的vmalloc机制: 进程的地址空间. ...

  8. 深入理解 C 指针阅读笔记 -- 第六章

    Chapter6.h #ifndef __CHAPTER_6_ #define __CHAPTER_6_ /*<深入理解C指针>学习笔记 -- 第六章*/ typedef struct _ ...

  9. 《图解HTTP》阅读笔记--第四章--HTTP状态码

    第四章.返回结果的HTTP状态码前言:状态码的职责是告诉用户服务器端描述返回的请求,以便用户判断服务器处理是否正常. 状态码由三位数字和原因短语组成,其中三位数字的首位指定了响应类别:---1xx 接 ...

随机推荐

  1. python3 解析xml

    转载:http://www.jb51.net/article/79494.htm 这篇文章主要为大家详细介绍了深入解读Python解析XML的几种方式,以ElementTree模块为例,演示具体使用方 ...

  2. matplotlib之设置极坐标的方向

    #!/usr/bin/env python3 #-*- coding:utf-8 -*- ############################ #File Name: polar.py #Auth ...

  3. AxureRP_for_chorme的安装和使用方法

    1.下载AxureRP_for_chorme_version.crx 2.打开Chrome,右上角菜单图标->更多->扩展程序 3.将crx文件拖入,安装 4.选中AxureRP的“已启用 ...

  4. layui进度条bug

    对于动态及生成的进度条,在渲染时候要使用element.init();element.init();element.progress('demo', percent+'%');

  5. winform 打印条码

    一个winform打印功能的示例 操作步骤:1.新建winform项目及创建窗体2.拖取 打印 相关控件 PageSetupDialog . PrintDialog . PrintDocument . ...

  6. Google Analytics Advanced Configuration - Google Analytics 高级配置

    该文档提供了Android SDK v3的部分元素的高级配置说明. Overview - 概述 Android Google Analytics SDK提供了Tracker类,应用可以用它给Googl ...

  7. java集成开发环境常用操作集

    1.简单搭建maven集成开发环境 一.     Jetty安装 下载地址(包涵windows和Linux各版本,Jetty9需要JDK7):http://download.eclipse.org/j ...

  8. Unix系统编程(一)

    主要内容:文件输入/输出的系统调用. 在Linux中,万事万物皆文件. 文件描述符的概念 通用I/O模型的系统调用: 打开文件 open 关闭文件 close 向文件写数据 write 从文件读数据 ...

  9. 转!sqlite3.OperationalError) no such table- users [SQL- 'SELECT users.id AS users_id, users.email AS u

    在注册新用户的时候报错: (sqlite3.OperationalError) no such table: users [SQL: 'SELECT users.id AS users_id, use ...

  10. Attention Mechanism

    首先介绍Attention机制: 转自:http://blog.csdn.net/malefactor/article/details/50550211 上面讲的是Soft Attention Mod ...