当前课程知识点:Linux 内核分析与应用 > 第5章 中断 > 5.1 中断机制概述 > Video
大家好
这一讲我们讲第五章的中断机制
那么首先呢我们来看一下中断是什么
我们说中断是CPU对系统发生的某个事件作出的一种反应
那么当中断发生的时候 CPU暂停正在执行的程序
保留现场后自动转去执行相应事件的处理程序
处理完成后返回到断点继续执行被打断的程序
听起来很简单 但实际上中断是操作系统的脉搏
是并发处理的基础 远不像概念这么简单
为什么引入中断 刚才我们说了
中断的引入是为了支持CPU和设备之间的并行操作
为什么可以进行并行呢
我们说当CPU启动设备进行输入输出后
设备便可以独立的工作了
CPU就转去处理自己的事情
当设备完成输入输出后
通过向CPU发出中断 报告此次输入输出的结果
让CPU决定如何处理以后的事情
这些从概念上说起来也是比较简单的
工程实践起来也是远没这么简单
那么CPU什么时候响应中断
我们说CPU收到中断信号以后呢
并不立即响应 而是在执行每条指令周期的最后一个时钟周期
一旦检测到中断信号有效
且中断允许标志位置1的时候呢
CPU才在当前指令执行完以后呢
转入中断响应周期
这里 我们给出一个中断模型
中断模型简单的来说实际上是一种C/S结构
为什么说它是C/S结构呢
系统中若干个CPU是用来接收中断事件 并进行处理的
若干个中断控制器形成树状的结构
那么这些控制器汇集系统中
所有外设的中断请求
并将中断事件分发给某一个CPU进行处理
那么如果对此模型进行简化以后呢 它实际上就是一种C/S结构模型
也就是说外设发出请求 这个请求呢
并不是马上传给CPU而是用中断控制器进行收集
中断控制器相当于中介
在外设与CPU之间架起了桥梁
那么当CPU接收到请求以后才给予应答
为了进一步的说明
中断控制器相当于中介 我们给出
8259中断控制器作为例子
在此我们并不对中断控制器给予详细的介绍
只是以简单的8259控制器为例说明呢
中断请求呢比如说从IR0
到IR7是从外设发来的
然后通过中断控制器的INT引脚向CPU发出中断请求
然后CPU通过中断引脚INTA应答请求
目前X86采用的是
APIC 也就是高级可编程控制器
那么下面对高级可编程中断控制器给予简要的介绍
比如说呢每个X86的核都有一个本地的APIC
这些本地的APIC呢
通过中断控制器通信总线呢就连接到IO APIC上
那么IO APIC收集各个外设的中断
并翻译成总线上的信息
传递给某个CPU上的本地APIC
这里我们来介绍一下
中断中机制与策略分离的设计理念
尽管中断与CPU密切相关
但是CPU的设计独立于中断控制器的设计
尽管中断是操作系统中非常重要的组成部分
但是操作系统设计者只负责提供接口
通过该接口就可以调用针对具体设备的中断服务程序
中断和对中断处理就被解除了耦合
无论是你在需要加入新的中断时
还是在你需要改变现有的中断服务程序时呢
又或者是取消对某个中断的支持的时候呢
CPU的架构和操作系统都无需做改变
这其中的功臣就是中断控制器
那么更详细的介绍参见我们Linux内核之旅上的中断趣味谈
下边介绍Linux内核中的中断子系统的相关软件架构
那么整个中断子系统分成4个部分
第一个部分是硬件无关的代码 我们称之为
Linux内核通用中断处理模块
无论是哪种CPU 哪种中断控制器 其中断处理的过程都有些相同的内容
这些相同的内容被抽象出来
此外呢各个设备的驱动代码中呢
也希望能用一个统一的接口实现中断相关的管理
第二部分叫CPU体系(结构)相关的中断处理
和系统使用的具体的CPU体系结构相关
第三部分叫中断控制器的驱动代码
那这部分呢和系统使用的中断控制器相关
第四部分叫普通外设的驱动
这些驱动将使用Linux内核通用的中断处理模块的API来实现自己的驱动逻辑
下边我们介绍中断向量
那么中断向量是中断中非常重要的概念
每个中断源都被分配了一个8位无符号的整数呢
作为类型码 也就是中断向量
那么中断向量和中断请求号是什么关系
它们之间是线性关系
在X86中呢 中断向量和中断请求号之间是一个
公式可以表示出来 这个公式为I=32+irq
那么这张表呢我们给出的中断向量表
从这个表中看出0到19号的中断向量呢
它表示的是不可屏蔽的中断或者异常
那么20到31号呢 它是intel所保留的
而32到127呢 就是外部中断
而128就是用于系统调用的
可编程异常 那么其他的呢我们就不做一一的介绍了
这其中还有一个非常重要的
结构叫做中断描述符表
也就是我们通常说的中断向量表
那么这个表中每一个中断占据一个表项
为什么要有一个中断向量表呢
大家都学过啊8086
那么在实地址模式中呢
CPU是把内存中从0开始的1K字节呢
就作为一个中断向量表
表中的每个表项占4个字节
由2个字节的段地址和2个字节的偏移量组成
这样构成的地址便是相应的中断处理程序的入口地址
但是在保护模式下呢
由4字节的表项构成的中断向量表呢
显然满足不了要求 这是因为两点 一点呢
除了2个字节的段描述符外呢 偏移量必须用4个字节来表示
第二点要有反应模式切换的信息
因此呢在保护模式下呢 中断向量表中的表项呢
就由8个字节组成 如图所示
中断向量表也叫作中断描述符表IDT
其中 每个表项叫做门描述符
为什么叫做门描述符呢
门的含义是什么呢 门的含义就是当中断发生的时候呢
必须通过这些门 然后才能进入相应的处理程序
其中 类型占3位
主要的门描述符为以下3种
第一种叫做中断门
它的类型码是什么呢 是110
中断门中的请求特权级 也就是DPL为0
因此说用户态的进程就不能访问intel的中断门
所有的中断处理程序都由中断门来激活
并全部限制在内核态
第二种叫做陷阱门 其类型码为111
与中断门类似 它与中断门唯一的区别是呢
其控制权通过陷阱门进入处理程序的时候呢
维持中断标志位不变
也就是说它是不关中断的 而中断门呢是关中断的
第三种呢叫系统门
这是Linux内核特别设置的
是用来让用户态的进程访问intel的陷阱门
因此门描述符的DPL就为3
那么系统调用呢就是通过系统门而进入内核的
通过前边的介绍 我们对中断的一些基础概念
进行了概要的说明
那么本节课以后呢大家还需要动手实践
在我们Linux内核之旅网站
电子杂志栏目中的第八期“中断”呢
将向读者依次解释中断概念
解析Linux中的中断实现机理
以及Linux下中断如何被使用
那么参考资料呢 我们可以去阅读《深入理解Linux内核》第三版的第四章
《Linux内核设计与实现》第三版的第七章
蜗窝科技网关于中断有一系列的文章
非常详细的介绍了中断的方方面面
中断是一个看似简单但工程型非常强的部分
因此希望大家务必阅读大量的资料 并动手实践
谢谢大家
-1.1 Linux操作系统概述
-1.2 Linux内核结构以及内核模块编程
--Video
-1.3 Linux内核源码中的双链表结构
--Video
-1.4 源码分析-内核中的哈希表
--Video
-1.5 动手实践-Linux内核模块的插入和删除
--Video
-第1章 概述--章节测验
-2.1 内存管理之内存寻址
--Video
-2.2 段机制
--Video
-2.3分页机制
--Video
-2.4 动手实践-把虚拟地址转换成物理地址
--Video
-第2章 内存寻址--章节测验
-3.1 进程概述
--Video
-3.2 Linux进程创建
--Video
-3.3 Linux进程调度
--Video
-3.4 动手实践-打印进程描述符task_struct中的字段
--Video
-3.5工程实践-基于内核模块的负载监控
--Video
-第3章 进程管理--章节测验
-4.1 Linux内存管理机制
--Video
-4.2 进程用户空间管理机制
--Video
-4.3 物理内存分配与回收机制(上)
--Video
-4.4 物理内存分配与回收机制(下)
--Video
-4.5 动手实践-Linux内存映射基础(上)
--Video
-4.6 动手实践-Linux内存映射实现(中)
--Video
-4.7 动手实践-Linux内存映射测试(下)
--Video
-4.8 初学者对内存管理的常见疑惑
-第4章 内存管理--章节测验
-5.1 中断机制概述
--Video
-5.2 中断处理机制
--Video
-5.3 中断下半部处理机制
--Video
-5.4 时钟中断机制
--Video
-5.5 动手实践-中断上半部的代码分析及应用
--Video
-5.6 动手实践-中断下半部的代码分析及应用
--Video
-第5章 中断--章节测验
-6.1 Linux中的各种API
--Video
-6.2 系统调用机制
--Video
-6.3 动手实践-添加系统调用(系统调用日志收集系统)
--Video
-第6章 系统调用--章节测验
-7.1 内核同步概述
--Video
-7.2 内核同步机制
--Video
-7.3 动手实践-内核多任务并发实例(上)
--Video
-7.4 动手实践-内核多任务并发实例(下)
--Video
-第7章 内核同步--章节测验
-8.1 虚拟文件系统的引入
--Video
-8.2 虚拟文件系统的主要数据结构
--Video
-8.3 文件系统中的各种缓存
--Video
-8.4 页高速缓存机制以及读写
--Video
-8.5 动手实践-编写一个文件系统(上)
--Video
-8.6 动手实践-编写一个文件系统(中)
--Video
-8.7 动手实践-编写一个文件系统(下)
--Video
-第8章 文件系统--章节测验
-9.1 设备驱动概述
--Video
-9.2 I/O空间管理
--Video
-9.3 设备驱动模型
--Video
-9.4 字符设备驱动程序简介
--Video
-9.5 块设备驱动程序简介
--Video
-9.6 动手实践-编写字符设备驱动程序
--Video
-9.7工程实践-编写块设备驱动的基础(上)
--Video
-9.8 工程实践-块设备驱动程序分析(中)
--Video
-9.9 工程实践-块设备驱动程序实现(下)
--Video
-第9章 设备驱动--章节测验
-致谢与说明
--Video