7.1 中断是什么,为什么要有中断

在 Linux 中文件 “/proc/进程pid/stat” 第一行的第 39 个字段是 “processor id”,它表示进程本次执行时最后所在的 CPU 编号。还可以用命令 ps -eo pid, args, psr | grep <pid>

7.2 操作系统是中断驱动的

7.3 中断分类

把中断按事件来源分类,来自 CPU 外部的中断就称为外部中断,来自 CPU 内部的中断称为内部中断。

外部中断按是否导致宕机来划分,可分为可屏蔽中断和不可屏蔽中断两种。

内部中断按是否正常来划分,可分为软中断和异常。

7.3.1 外部中断

外部中断的中断源是硬件。

外部硬件的中断通过两根信号线通知 CPU 的,分别是 INTR(INTeRrupt)和NMI(Non Maskable Interrupt)。

可屏蔽中断通过 INTR 引脚进入 CPU,外部设备如硬盘、网卡等发出的中断都是可屏蔽中断。

中断上半部和下半部:

操作系统是中断驱动的,中断发生后会执行相应的中断处理程序,我们希望 CPU 中断响应的时间越短越好,这样便能响应更多设备的中断。于是,把中断处理程序分为上半部和下半部两部分,把中断处理程序中需要立即执行的部分划分到上半部,完成中断应答或硬件复位等重要紧迫工作。中断处理程序中不紧急的部分则被推迟到下半部中去完成。上半部是在关中断的情况下执行。

中断发起时,相应的中断向量号通过 NMI 或 INTR 引脚被传入 CPU,中断向量号是中断向量表或中断描述符表里中断项的下标,CPU 根据此中断向量号在中断向量表或中断描述符表中检索对应的中断处理程序并去执行。

不可屏蔽中断的中断向量号为 2。

7.3.2 内部中断

内部中断可分为软中断和异常。

软中断就是由硬件主动发起的中断,因为它来自于软件,所以称之为软中断。

发起中断的指令:

  • int 8位立即数。
  • int3。调试断点指令,其所触发的中断向量号是 3。我们用 gdb 或 bochs 调试程序时,实际上就是调试器 fork 了一个子进程,用于执行被调试的程序。调试器中经常要设置断点,其原理就是父进程修改了子进程的指令,将其用 int3 指令替换,从而子进程调用 int3 触发中断。
  • into。中断溢出指令,中断向量号是 4。
  • bound。检查数组索引越界指令,触发 5 号中断。
  • ud2。未定义指令,触发 6 号中断。

异常是指令执行期间 CPU 内部产生的错误引起的。

异常按照轻重程度可分为以下三种:

  • Fault。可以被修复。
  • Trap。常用于调试中。
  • Abort。错误无法修复。

7.4 中断描述符表

中断描述符表(IDT)是保护模式下用于存储中断处理程序入口的表。

实模式下用于存储程序入口的表叫做中断向量表(IVT)。

中断描述符表中的描述符名称是门。




中断描述符表寄存器(IDTR)。

同加载 GDTR 一样,加载 IDTR 也有个专门的指令:


lidt <48位内存数据>

7.4.1 中断处理过程及保护

完整的中断过程分为 CPU 外和 CPU 内两部分:

  • CPU 外:外部设备的中断由中断代理芯片接收,处理后将该中断的中断向量号发送到 CPU。
  • CPU 内:CPU 执行该中断向量号对应的中断处理程序。

CPU 内的过程:

  • 处理器根据中断向量号定位中断门描述符
  • 处理器进行特权级检查
  • 执行中断处理程序

从中断返回的指令是 iret。

指令 cli 使 IF 位为 0,这称为关中断,指令 sti 使 IF 位为 1,这称为开中断。

进入中断时要把 NT 位和 TF 位置为 0。

7.4.2 中断发生时的压栈


中断返回使用 iret 指令实现。

如果有中断错误码,处理器并不会主动跳过它的位置,必须手动将其跳过,在准备用 iret 指令返回时,当前栈指针 esp 必须指向栈中备份的 EIP_old 所在的位置。

7.4.3 中断错误码

中断错误码用来指明中断发生在哪个段上。

EXT 表示外部事件,如果中断源来自不可屏蔽中断 NMI 或外部设备,EXT 为 1,否则为 0。

IDT 表示选择子是否指向中断描述符表 IDT,IDT 为 1 表示选择子指向中断描述符表,否则指向全局描述符表 GDT 或 局部描述符表 LDT。

TI 为 0 是指明选择子是从 GDT 中检索描述符,为 1 时是从 LDT 中检索描述符。

通常能够压入错误码的中断属于中断向量号 0 ~ 32 之内的异常,而外部中断(32 ~ 255)和 int 软中断并不会产生错误码。

通常我们不用处理错误码。

7.5 可编程中断控制器 8259A

8259A 的作用是负责所有来自外部的中断。

7.5.1 8259A 介绍

8259A 用于管理和控制可屏蔽中断,它表现在屏蔽外设中断,对它们实行优先级判决,向 CPU 提供中断向量号等功能。

Intel 处理器共支持 256 个中断。

n 片 8259A 通过级联可支持 7n+1 个中断源。

7.5.2 8259A 的编程

8259A 内部有两组寄存器,一组是初始化命令寄存器组,用来保存初始化命令字(ICW),ICW 共 4 个,ICW1 ~ ICW4。另一组是操作命令寄存器,用来保存操作命令字(OCW),OCW 共 3 个,OCW1 ~ OCW3。

对 8259A 的编程,也分为初始化和操作两部分:

  • 一部分是用 ICW 做初始化,用来确定是否需要级联,设置起始中断向量号,设置中断结束模式。
  • 另一部分是用 OCW 来操作控制 8259A。

ICW1 用来初始化 8259A 的连接方式和中断信号的触发方式。ICW1 需要写入主片的 0x20 端口和从片的 0xA0 端口。

IC4 为 1 时表示要写入 ICW4,为 0 时不需要。

SNGL 表示 single,若 SNGL 为 1,表示单片,否则表示级联。

ADI 用来设置 8085 的调用时间间隔,x86 不需要设置。

LTIM 用来设置中断检测方式,LTIM 为 0 表示边沿触发,LTIM 为 1 表示电平触发。

ICW2 用来设置起始中断向量号。ICW2 需要写入到主片的 0x21 端口和从片的 0xA1 端口。

ICW3 仅在级联的方式下才需要,用来设置主片和从片用哪个 IRQ 接口互连。ICW3 需要写入主片的 0x21 端口及从片的 0xA1 端口。

主片和从片的 ICW3 结构不同。

主片上中置 1 的那一位对应的 IRQ 接口用于连接从片。

从片上低三位用于表示连接到主片上的 IRQ 接口。


SFNM 表示特殊全嵌套模式,若 SFNM 为 0,则表示全嵌套模式,为 1 则表示特殊全嵌套模式。

BUF 表示是否工作在缓冲模式。BUF 为 0,表示工作在非缓冲模式,BUF 为 1,表示工作在缓冲模式。

如果工作在缓冲模式下,M/S 为 1 表示是主片,M/S 为 0 表示是从片。若工作在非缓冲模式下,M/S 无效。

AEOI 表示自动结束中断,8259A 在收到中断结束信号时才能继续处理下一个中断。若 AEOI 为 0,表示非自动。若 AEOI 为 1,表示自动结束中断。

μPM 表示位处理器类型。若 μPM 为 0,表示 8080 或 8085 处理器。若 μPM 为 1,表示 x86 处理器。

OCW1 用来屏蔽连接在 8259A 上的外部设备的中断信号,某位为 1,对应的 IRQ 上的中断信号就屏蔽了。OCW 要写入主片的 0x21 或从片的 0xA1 端口。

OCW2 用来设置中断结束方式和优先级模式。OCW2 写入主片的 0x20 及从片的 0xA0 端口。

SL 位针对某个特定优先级的中断进行操作。

OCW2 其中一个作用是发 EOI 信号结束中断。

R 位 0 表示固定优先级方式,为 1 表示循环优先级方式。

7.6 编写中断处理程序

7.6.1 从最简单的中断处理程序开始

7.7 可编程计数器/定时器 8253 简介

7.7.1 时钟 - 给设备打拍子

外部时钟和内部时钟是两套独立运行的定时体系。

计时器的功能就是定时发信号。

7.7.2 8253 入门

计数器 0 的作用是产生时钟信号,这个时钟是指连接到主片 IRQ0 引脚上的那个时钟,也就是说计数器 0 决定时钟中断信号的发生频率。

计数器 0 的计时到期后就会发出时钟中断信号,中断代理 8259A 就会感知引脚 IRQ0 有中断信号到来。

7.7.4 8253 工作方式

操作系统真象还原第七章相关推荐

  1. 《操作系统真象还原》第二章

    <操作系统真象还原>第二章 编写MBR主引导记录 载入内存 过程: (1)程序被加载器(软件或硬件)加载到内存某个区域. (2)CPU的cs:ip寄存器被指向这个程序的起始地址. 从按下主 ...

  2. 《操作系统真象还原》第九章

    <操作系统真象还原>第九章 本篇对应书籍第九章的内容 本篇内容介绍了线程是什么,多线程的原理,多线程用到的核心数据结构,以及通过代码实现了内核多线程的调度 线程是什么? 执行流 过去,计算 ...

  3. 《操作系统真象还原》1-3章 学习记录

    文章目录 前言 一.开始实验前的一些基本问题解答? section的含义? vstart的含义? $ 和 $$区别? 实模式的特点? CPU如何和硬盘进行交互? CPU和IO设备交互方式? 程序载入内 ...

  4. 《操作系统真象还原》第九章 ---- 终进入线程动斧开刀 豁然开朗拨云见日 还需解决同步机制才能长舒气

    文章目录 专栏博客链接 相关查阅博客链接 本书中错误勘误 进程 线程的自我小理解 线程 进程的状态 内核级线程 & 用户级线程 初步实现内核级线程 浪费两三个小时调试的辛酸史 编写thread ...

  5. 操作系统真象还原第2章:编写MBR主引导记录

    前言 这章的内容挺少的,也很简单,如果环境没配置错的话是没啥问题的.但是这章也很精彩,把引导的过程给说了出来,我也是看了几遍把这个过程给大致看懂了. 首先计算机一开机这个时cpu会自动把cs:ip指针 ...

  6. 操作系统真象还原——第5章 从保护模式到内核

    目录 前言 5.1 获取物理内存容量 5.1.1 学习Linux获取内存的方法 5.1.2 实战内存容量检测 5.2 内存分页 为什么需要分页? 一级页表 二级页表 如何设计一个页表 分页机制的代码实 ...

  7. 《操作系统真象还原》第二章 ---- 编写MBR主引导记录 初尝编写的快乐 雏形已显!

    文章目录 专栏博客链接 前引 相关术语 理清操作系统启动程序运行流程(部分) 编写MBR引导内容 编译并检验mbr.bin Linux dd 磁盘操作指令与参数 模拟操作试一试 结束语 专栏博客链接 ...

  8. 操作系统真象还原第3章:完善MBR

    前言 这次我出现了一些BUG,导致我忙活了一阵子,还好的是解决了 老规矩还是把整个流程过一遍,当MBR忙活完后,就需要把自己手中的棒交给loader了,MBR的作用就是从硬盘中的内核加载器移动到内存中 ...

  9. 操作系统真象还原第5章:保护模式进阶,向内核进阶

    前言 由于涉及到马上要搞实习的事情,搞得我十分的浮躁,自己也是频繁失眠,想来还是自己太过懒了,没控制住自己,自己也在这一个多月没搞好,尤其是本来想花几天时间来写一个高性能服务器,也把游双大佬的linu ...

最新文章

  1. 平面最接近点对问题(分治)
  2. Linux用户管理(五)Linux系统的启动
  3. 第 10 章 容器监控 - 085 - 如何快速部署 Prometheus?
  4. Android静态安全检测 - Broadcast Receiver组件暴露
  5. mysql 多值属性_数据库 名词解释:单值属性和多值属性
  6. 安卓系统双屏异显_Android实现双屏异显
  7. HTML5第一弹:彩虹爆炸图
  8. Oracle dbms_job管理
  9. curl error code 60 51 代码解决方式
  10. [独库骑行之奇山异石]丹霞地貌和雅丹地貌
  11. Ninth scrum meeting - 2015/11/3
  12. 反射--获取构造器,获取父类,获取带泛型的父类,获取实现的接口,获取所在的包,获取注解
  13. 数学作图工具_推荐工作学习中用到的三款在线作图神器!
  14. Windows10 开机跳过密码验证
  15. 一步一步教你使用云服务器部署爬虫
  16. 京淘商城后台管理系统
  17. 微软 2021 秋季发布会汇总
  18. Python面试题笔试题Django部分总结
  19. IOS开发之蘑菇街框架
  20. anaconda创建虚拟环境并安装tensorflow

热门文章

  1. 自动化测试 | 解决方案聚焦:如何使用PXI仪器进行高级数字测试
  2. 【98期】面试官:给我说说你对Java GC机制的理解?
  3. Shader山下(十六)坐标空间与转换矩阵
  4. 安卓入门,简单画图板的实现
  5. 笔记2--认识O(logN)的排序--快速排序
  6. Vulnhub-medium_socnet
  7. 业务巡检系统的整体设计和数据流程
  8. CentOS文件备份|还原
  9. [VishawaCTF]部分wp
  10. 查看SQL Server的版本