第七章 中断

news2024/9/30 7:15:00

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

并发是指单位时间内的累积工作量。
并行是指真正同时进行的工作量。
一个CPU在一个时间只能执行一个进程,任何瞬间任务只在一个核心上运行。
而CPU外的设备是独立于CPU的,它与CPU同步运行,CPU抽出一点时间来处理中断,外部设备就可以同CPU并行工作了,整个计算机系统可以大幅度提升效率。

操作系统是中断驱动的

操作系统是个死循环,一直在重复工作,工作期间接受别的指令中断进行操作,然后继续重复运行。操作系统周而复始的运行,其目的就是等待某些事情的发生,而这个事件是以中断的形式通知操作系统的。

中断分类

外部中断

外部中断是指来自CPU外部的中断,而外部的中断源必须是某个硬件,所以外部中断又称为硬件中断。(就是来自外设的任务)

为了让CPU获得每个外部设备的中断信号,CPU提供统一的接口作为中断信号的公共路线,来自外设的中断信号都共享公共路线连接到CPU。

CPU为大家提供了两条信号线。外部硬件的中断是通过两根信号线通知CPU的,这两根信号线就是INTR和NMI。
在这里插入图片描述

在单核CPU上运行的程序都是串行的,所有任务,包括中断处理程序都是一个接一个在CPU上运行的,所有任务都共享同一个CPU,CPU在各个任务间不断切换才实现了并发。

CPU通过两根中断线区分事情的紧急程度。只要从INTR引脚收到的中断都是不影响系统运行的,可以随时处理,甚至CPU可以不处理(可屏蔽中断)。而只要从NMI引脚收到的中断表示系统中发生了致命的错误(不可屏蔽中断)。
在这里插入图片描述
首先为每一种中断分配一个中断向量号,中断向量号就是一个整数,它就是中断向量表或中断描述表中的索引下标,用来索引中断项。中断发起时,相应的中断向量号通过NMI或INTR引脚被传入CPU,中断向量号是中断向量表或中断描述符表里中断项的下标,CPU根据此中断项的下标,CPU根据此中断向量号在中断向量表或中断描述符中检索对应的中断处理程序并去执行。

内部中断

内部中断可以分为软中断和异常。
在这里插入图片描述

以下是可以发起中断的指令:

在这里插入图片描述
除了第一种“int8位立即数”之外,其他的几种又可以称为异常。因为它们既具备软中断的“主动”行为,又具备异常的“错误”结果。

异常是另一种内部中断,是指令执行期间CPU内部产生的错误引起的。由于是运行时错误,所以它不受标志寄存器eflags中的IF位影响,无法向用户隐瞒。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

中断描述表

中断描述表是保护模式下用于存储中断处理程序入口的表,当CPU接收一个中断时,需要用中断向量在此表中检索对应的描述符,在该描述符中找到中断处理程序的起始地址。
除了调用门外,其他三个门都可以存在于中断描述符表中。门就是记录了一段程序的起始地址,也就是通往这段程序的入口。

一个中断源就会产生一个中断向量,每个中断向量都对应中断描述符表中的一个门描述符,任何中断源都通过中断向量对应到中断描述符表中的门描述符,通过该门描述符就找到了对应的中断处理程序。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
IDT的位置不固定,CPU通过中断描述符表寄存器(IDTR)找到它。该寄存器分为两部分:第0-15位是表界限,即IDT大小减1,第16-47位是IDT的基地址。中断描述符表地址加载到这个寄存器中,只有寄存器IDTR指向了IDT,当CPU接收到中断向量号时才能找到中断向量处理程序。

在这里插入图片描述

中断处理过程及保护

在这里插入图片描述
CPU内的处理过程:
在这里插入图片描述
在这里插入图片描述

处理器提供了专门用于控制IF位的指令,通过它,IF可以直接控制。指令cli使IF位为0,这称为关中断,指令sti使IF位为1,这称为开中断。IF位只能限制外部设备的中断,对那些影响系统正常运行的中断都无效。

进入中断时,NT位和TF位都为0。TF表示Trap Flag,陷阱标志位,用在调试环境中,禁止单步执行。NT表示Nest Task Flag,即任务嵌套标志位,也就是用来标记任务嵌套调用的情况。任务嵌套调用是指CPU将当前正执行的旧任务挂起,转去执行另外的新任务,待新任务执行完后,CPU再回到旧任务继续执行。当CPU执行iret指令(中断返回指令),它会检查NT位的值,如果NT位为1,这说明当前任务是被嵌套执行的,因此会从自己TSS中“上一个任务TSS的指针”字段中获取旧任务,然后去执行该任务。如果NT位值为0,表示当前是在中断处理环境下,于是就执行正常的中断退出程序。

在这里插入图片描述

中断发生时的压栈

在这里插入图片描述
在这里插入图片描述

中断错误码

指明中断发生在哪个段上。错误码本质上就是个描述符选择子,通过低3位属性来修饰此选择子指向是哪个表中的哪个描述符。当全0的错误码出现时,表示中断的发生与特定的段无关,或者引用了一个空描述符,引用描述符就是往段寄存器中加载选择子的时候,处理器发现选择子指向的描述符是空的。

可编程中断控制器8259A

8259A的作用是负责所有来自外设的中断,其中包括来自时钟的中断。

8259A介绍

8259A是中断代理,当有多个中断同时发生时,由它负责对所有中断仲裁,决定哪个中断优先被CPU受理。

在这里插入图片描述

Intel处理器共支持256个中断,但8259A只可以管理8个中断。为了多支持一些设备,可以将多个8259A组合(级联)。最多可级联9个,也就是最多支持64个中断。n片8259A通过级联可支持7n+1个中断源。

在这里插入图片描述

8259A工作流程:
在这里插入图片描述

8259A的编程

在这里插入图片描述

8259A内部有两组寄存器ICW和OCW。
ICW是初始化命令寄存器组,用来保存初始化命令字,共4个。
OCW是操作命令寄存器组,用来保存操作命令字,共3个。

在这里插入图片描述

ICW1初始化8259A的连接方式(单片还是多片级联)和中断信号的触发方式(边沿触发还是电平触发)。

在这里插入图片描述

ICW2用来设置起始中断向量号,只要指定IRQ0映射到的中断向量号,其他IRQ接口对应的中断向量号会顺着自动排下去。ICW2需要写入到主片的0x21端口和从片的0xA1端口。

ICW3仅在级联的方式下才需要,用来设置主片和从片用哪个IRQ接口互连。ICW2需要写入到主片的0x21端口和从片的0xA1端口。在这里插入图片描述

ICW4用于设置8259A的工作模式,当ICW1中的IC4为1时才需要ICW4。ICW4需要写入到主片的0x21端口和从片的0xA1端口。

在这里插入图片描述

OCW1用来屏蔽连接在8259A上的外部设备的中断信号(是否 把来自外部设备的中断信号转发给CPU),实际上就是把OCW1写入了IMR寄存器。OCW1需要写入到主片的0x21端口和从片的0xA1端口。

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

OCW3用来设定特殊屏蔽方式及查询方式。OCW3需要写入到主片的0x20端口和从片的0xA0端口。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

ICW1、OCW2、OCW3的写入端口是一致的,通过各控制字中的第4-3位标识位来确定某个控制字。

在这里插入图片描述

在这里插入图片描述

编写中断处理程序

中断处理程序

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

时钟——给设备打拍子

为了让所有设备之间的通信井然有序,各通信设备间必须有统一的节奏,不能各干各的,这个节奏就称为定时或时钟。是一种使设备间相互配合而避免发生冲突的节拍。

内部时钟:指处理处理器内部元件,主要用于控制、同步内部工作过程的步调。内部时钟不可改(应该是最快的,纳秒级(ns))。内部时钟是由晶体振荡器产生的,简称晶振,其频率经过分频之后就是主板的外频,处理器和南北桥之间的通信就基于外频。处理器将外频乘以某个倍数之后便是主频,处理器取指令、执行指令中所消耗的时钟周期,都是基于主频的。

外部时钟:指处理器与外部设备或外部设备之间通信采用的一种时序。一般为毫秒级或秒级。

外部时钟和内部时钟是两套独立运行的定时体系。对于处理器与外部设备之间的通信,要保证运行在不同时钟节拍下的设备能够同步通信。应以处理器的内部时钟为依据来设计外部设备的时钟,既要符合处理器内部运行时序的规定,又要满足外部设备工作时序的要求。通过定时计数器将晶振产生的信号频率分频,就能产生所需要的各种定时信号。

定时器的功能就是定时发信号。当到达了所计数的时间,计数器可以自动发一个输出信号,可以用该信号向处理器发出中断,这样处理器可以去执行相应的中断处理程序。或者用该信号直接启动某些外部设备。

定时器可分为不可编程定时器和可编程定时器,8253就是可编程定时器。

计数器和定时器是一样的。每一次时钟脉冲信号到来时就会修改计数值。
在这里插入图片描述

8253入门

8253内部有三个独立的计数器,既可以同时工作,又可以各干各的。

在这里插入图片描述

在这里插入图片描述

在计数器开始计数之前,计数初值保存在寄存器中,计数器开始执行时将初值载入,计数器的CLK每收到一次脉冲信号,计数值减1,同时将当前值保存在输出锁存器中。当计数值减到0时,表示定时工作结束,此时将通过OUT引脚发出信号,此信号可以用来向处理器发出中断请求,也可以直接启动某个设备工作。

在这里插入图片描述

8253控制字

控制字寄存器中保存的内容称为控制字,控制字用来设置所指定的计数器的工作方式、读写格式及数制(控制模式)。

在这里插入图片描述

8253工作方式

在这里插入图片描述

计数器开始计数条件:
GATE为高电平,即GATE=1,这是由硬件来控制的;
计数初值已写入计数器中的减法计数器,这事由软件out指令控制的。

软件启动:条件1已完成,只差条件2。工作方式0、2、3、4。
硬件启动:条件2已完成,只差条件1。工作方式1、5。

计数停止:

强制终止:将GATE置为0。工作方式2、3。(计数值重复计数,变为0后回到初值)
自动终止:定时一到期就停止。工作方式0、1、4、5 。

在这里插入图片描述

使用8253来提升时钟中断信号的频率,而时钟中断信号是由计数器0负责产生的。将高频的输入脉冲信号CLK转换为低频的输出信号OUT,此信号就是时钟中断信号。1.193180MHZ是计数器的工作频率,也就是说,一秒钟会有1193180次脉冲信号。

在这里插入图片描述

8253初始化步骤

1.往控制字寄存器端口0x43中写入控制字;
2.在所指定使用的计数器端口中写入计数初值。

提高时钟中断的频率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/545421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年十大最佳黑客工具!

​用心做分享,只为给您最好的学习教程 如果您觉得文章不错,欢迎持续学习 在今年根据实际情况,结合全球黑客共同推崇,选出了2023年十大最佳黑客工具。 每一年,我都会持续更新,并根据实际现实情况随时更改…

山西煤矿电子封条算法 opencv

山西煤矿电子封条通过pythonopencv网络模型AI视觉技术,pythonopencv算法模型实现对出入井人监察控制、调度室空岗识别、生产作业状态、摄像头遮挡、挪动角度识别、货运车辆出矿识别等。 OpenCV的全称是Open Source Computer Vision Library,是一个跨平台…

CleanMyMac X如何下载解锁完整版本?

这是一款很受到mac用户喜爱的清理软件。不仅清理文件的步骤十分简单,电脑小白用户也可以高效清理Mac电脑。作为一款全方位保护电脑的软件,CleanMyMac已经不满足于只做简单的Mac清理工具,而是为mac用户提供更多的实用功能:优化系统…

机器学习随记(7)——bootstrap、bagging、boosting、随机森林

bootstrap:是一种统计方法,也是一种思想,简单说就是在所有样本集中进行有放回地抽样,抽取n个样本。如果不清楚样本的分布,bootstrap是一种合适的方法。 bagging:Bagging方法在训练过程中,各基分…

windows提权

权限提升概述 1、提权介绍 权限提升:攻击者通过安全漏洞把获取到的受限制的低权限用户突破限制,提权至高权限的管理员用户,从而获取对整个系统的控制权 windows:user --> system/administrator linux:user --&g…

ASEMI代理Infineon英飞凌IPB072N15N3G原厂MOS管

编辑-Z IPB072N15N3G参数描述: 型号:IPB072N15N3G 持续漏极电流:100A 脉冲漏极电流:400A 雪崩能量,单脉冲:780 mJ 栅极-源极电压:20V 功率耗散:300W 操作和储存温度&#xf…

Voxformer代码 DataLoader 的编写

Stage 1: 目标是 使用QPN 生成 Occupancy Field 读取 需要读取 pseudo 的 vox_path 实际的 test 发生在 lmsnet.py 这个文件 input :25625632 的 pseudo point output: 12812816 的 Occupancy Grid 代码中 实际inference 的输入是 img_metas[0]["pseudo_pc"] 因此…

算法小课堂(十)随机化算法

目录 一、概述 1.1概念 1.2分类 二、数值随机化算法 2.1随机数 2.2用随机投点法计算Π值 2.3随机投点法计算定积分 三、舍伍德(Sherwood)型随机化算法 3.1随机洗牌算法 3.2随机快速排序:随机选择枢点的快速排序算法 3.3找出这n个元素…

STL——string类的模拟实现

0.关注博主有更多知识 C知识合集 目录 1.编码问题 2.string类概述 2.6习题练习 3.string类的模拟实现 3.1成员变量 3.2迭代器部分 3.3类的默认成员部分 3.4容量接口 3.5增删查改接口 3.6通用接口 3.7输入与输出 3.8完整代码 1.编码问题 实际上在我们接触C之前就…

SpringBoot入门(构建、打包、启动、起步依赖starter)

文章目录 1 SpringBoot快速入门1.1 开发步骤步骤1 创建新模块步骤2 创建 Controller步骤3 启动服务器步骤4 进行测试 1.2 对比1.3 官网构建工程步骤1 进入SpringBoot官网步骤2 选择依赖步骤3 生成工程 1.4 SpringBoot工程快速启动1.4.1 问题导入1.4.2 打包1.4.3 启动 2 SpringB…

OverTheWireBandit教程(1-10)

这个网站还挺好玩的于是我就抽点时间做了一下 OverTheWire的登录网址:OverTheWire: Bandit 本人用的是远程连接软件mobaxterm,windows自带的ssh版本不对用不了 Bandit Level 0 Level Goal The goal of this level is for you to log into the game usi…

使用ASM直接生成字节码的方法

ASM是一套java字节码分析/生成/修改的工具,它能够在java程序运行时直接修改java字节码文件,换句话说它能够直接修改java的二进制文件;也能够跳过编译直接生成字节码文件。所以ASM功能非常强大,对于代码性能提升、代码问题定位都非…

【技术】《Netty》从零开始学netty源码(六十)之ByteToMessageDecoder

ByteToMessageDecoder 在Netty中用于拆包的解码器都继承了抽象类ByteToMessageDecoder,它的类结构如下: 从中可以看出它其实就是一个handler,只要添加到pipeline中channel每次读取数据的时候都会得到解析,它的数据结构如下&#…

业绩涨,股价不涨,蓝思科技深陷「果链困局」

作者 | 辰纹 来源 | 洞见新研社 曾经的女首富,蓝思科技董事长周群飞很困惑,公司业绩明明还算不错,可股价却怎么也涨不起来,距离市值2000亿的顶点更是遥遥无望。 根据不久前(4月23日)蓝思科技发布的2022年…

Mybatis中处理特殊SQL处理逻辑

文章目录 0、前言1、模糊查询2、动态表名3、获取自增的组件4、批量删除 0、前言 在MyBatis中可能会有一些特殊的SQL需要去执行,一般就是模糊查询、批量删除、动态设置表名、添加功能获取自增的主键这几种,现在分别来进行说明。 为了方便演示 &#xff0…

强化学习路线规划之深度学习代码练习预备

前面已经练习过神经网络的相关代码,其实弄明白了你会发现深度学习其实是个黑盒,不论是TensorFlow还是pytorch都已经为我们封装好了,我们不需要理解深度学习如何实现,神经网络如何计算,这些都不用我们管,可能…

一看就懂之与栈结构(FILO)相对的——队列结构(FLFO)

文章目录 一、什么是队列,什么是FIFO二、使用C模拟实现以及解析队列1.结构体的定义2.队列的创建及销毁3.实现插入操作4.队列删除操作5.获取栈中有效元素个数以及头元素尾元素 源代码分享 一、什么是队列,什么是FIFO ​ 队列允许在一端进行插入操作&…

微服务之以nacos注册中心,以gateway路由转发服务调用实例(第一篇)

实现以nacos为注册中心,网关路由转发调用 项目版本汇总项目初始化新建仓库拉取仓库项目父工程pom初始化依赖版本选择pom文件如下 网关服务构建pom文件启动类配置文件YMLnacos启动新建命名空间配置网关yml(nacos)网关服务启动 用户服务构建pom文件启动类配置文件YML新增url接口配…

[网鼎杯 2020 青龙组]jocker 题解

32位无壳 堆栈有问题 先修堆栈在反编译 查看关键函数 对输入的字符串进行了加密 加密之后omg函数中与存储的字符串进行比较 我们先解密这个 提取数据 解密脚本 data[0x66,0x6b,0x63,0x64,0x7f,0x61,0x67,0x64,0x3b,0x56,0x6b,0x61,0x7b,0x26,0x3b,0x50,0x63,0x5f,0x4d,0x5…

javascript基础二:Javscript字符串的常用方法有哪些?

在日常开发中,我们对字符串也是操作蛮多,这里我们来整理下字符串的一下最常用的方法 一、操作方法 字符串常用的操作方法归纳为增、删、改、查 增 这里增的意思并不是说直接增添内容,而是创建字符串的一个副本,再进行操作 除了…