第七章 中断
中断是什么,为什么要有中断
并发是指单位时间内的累积工作量。
并行是指真正同时进行的工作量。
一个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.在所指定使用的计数器端口中写入计数初值。
提高时钟中断的频率
相关文章:

第七章 中断
中断是什么,为什么要有中断 并发是指单位时间内的累积工作量。 并行是指真正同时进行的工作量。 一个CPU在一个时间只能执行一个进程,任何瞬间任务只在一个核心上运行。 而CPU外的设备是独立于CPU的,它与CPU同步运行,CPU抽出一点…...
1116 Come on! Let‘s C(38行代码+详细注释)
分数 20 全屏浏览题目 作者 CHEN, Yue 单位 浙江大学 "Lets C" is a popular and fun programming contest hosted by the College of Computer Science and Technology, Zhejiang University. Since the idea of the contest is for fun, the award rules are f…...

深入学习《c语言函数》
📕博主介绍:目前大一正在学习c语言,数据结构,计算机网络。 c语言学习,是为了更好的学习其他的编程语言,C语言是母体语言,是人机交互接近底层的桥梁。 本章学习函数。 让我们开启c语言学习之旅吧…...

Pytorch从零开始实现Vision Transformer (from scratch)
Pytorch从零开始实现Vision Transformer 前言一、Vision Transformer架构介绍1. Patch Embedding2. Multi-Head Attention3. Transformer BlockFeed Forward 二、预备知识1. Einsum2. Einops 三、Vision Transformer代码实现0. 导入库1. Patch Embedding2. Residual & Norm…...
ES6函数新增了哪些扩展?
目录 一、参数二、属性函数的length属性name属性 三、作用域四、严格模式五、箭头函数 一、参数 ES6允许为函数的参数设置默认值 function log(x, y World) {console.log(x, y); }console.log(Hello) // Hello World console.log(Hello, China) // Hello China console.log(…...

【firewalld防火墙】
目录 一、firewalld概述二、firewalld 与 iptables 的区别1、firewalld 区域的概念 三、firewalld防火墙默认的9个区域四、Firewalld 网络区域1、区域介绍2、firewalld数据处理流程 五、firewalld防火墙的配置方法1、使用firewall-cmd 命令行工具。2、使用firewall-config 图形…...

CNNs: ZFNet之CNN的可视化网络介绍
CNNs: ZFNet之CNN的可视化网络介绍 导言Deconvnet1. Unpooling2. ReLU3. Transpose conv AlexNet网络修改AlexNet Deconv网络介绍特征可视化 导言 上一个内容,我们主要学习了AlexNet网络的实现、超参数对网络结果的影响以及网络中涉及到一些其他的知识点࿰…...

云原生之深入解析Airbnb的动态Kubernetes集群扩缩容
一、前言 Airbnb 基础设施的一个重要作用是保证我们的云能够根据需求上升或下降进行自动扩缩容,我们每天的流量波动都非常大,需要依靠动态扩缩容来保证服务的正常运行。为了支持扩缩容,Airbnb 使用了 Kubernetes 编排系统,并且使…...

Django框架之模板其他补充
本篇文章是对django框架模板内容的一些补充。包含注释、html转义和csrf内容。 目录 注释 单行注释 多行注释 HTML转义 Escape Safe Autoescape CSRF 防止csrf方式 表单中使用 ajax请求添加 注释 单行注释 语法:{# 注释内容 #} 示例: {# 注…...

安装Maven 3.6.1:图文详细教程(适用于Windows系统)
一、官网下载对应版本 推荐使用maven3.6.1版本,对应下载链接: Maven3.6.1下载地址 或者,这里提供csdn下载地址,点击下载即可: Maven3.6.1直链下载 其他版本下载地址: 进入网址:http://mave…...

计算机图形学 | 实验八:Phong模型
计算机图形学 | 实验八:Phong模型 计算机图形学 | 实验八:Phong模型Phong模型光源设置 光照计算定向光点光源聚光 华中科技大学《计算机图形学》课程 MOOC地址:计算机图形学(HUST) 计算机图形学 | 实验八:…...
第三十一回:GestureDetector Widget
文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了ListView响应事件的内容t,本章回中将介绍 GestureDetector Widget.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在这里介绍的GestureDetector是一个事件响应Widget,它可以响应双击事件࿰…...

Java面试知识点(全)-Java并发-多线程JUC三- JUC集合/线程池
Java面试知识点(全) 导航: https://nanxiang.blog.csdn.net/article/details/130640392 注:随时更新 JUC集合类 为什么HashTable慢? 它的并发度是什么? 那么ConcurrentHashMap并发度是什么? Hashtable之所以效率低下主要是因为其实现使用了synchro…...

Android 如何获取有效的DeviceId
目录 前言官方唯一标识符建议使用广告 ID使用实例 ID 和 GUID不要使用 MAC 地址标识符特性常见用例和适用的标识符 解决方案DeviceIdANDROID_IDMac地址UUID补充 总结 前言 从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可…...

<SQL>《SQL命令(含例句)精心整理版(2)》
《SQL命令(含例句)精心整理版(2)》 跳转《SQL命令(含例句)精心整理版(1)8 函数8.1 文本处理函数8.2 数值处理函数8.3 时间处理函数8.3.1 时间戳转化为自定义格式from_unixtime8.3.2 …...

完全自主研发,聚芯微发布3D dToF图像传感器芯片!
日前,由中国半导体行业协会IC设计分会(ICCAD)、芯原股份、松山湖管委会主办的主题为“AR/VR/XR元宇宙”的“2023松山湖中国IC创新高峰论坛”正式在广东东莞松山湖召开。武汉市聚芯微电子有限责任公司发布了完全自主知识产权的3D dToF图像传感…...

MySQL 事物(w字)
目录 事物 首先我们来看一个简单的问题 什么是事务 为什么会出现事务 事务的版本支持 事务提交方式 事务常见操作方式 设置隔离级别 事物操作 事物结论 事务隔离级别 理解隔离性 隔离级别 查看与设置隔离性 注意可重复读【Repeatable Read】的可能问题ÿ…...

字节跳动测试岗四面总结....
字节一面 1、 简单做一下自我介绍 2、 简要介绍一下项目/你负责的模块/选一个模块说一下你设计的用例 3 、get请求和post请求的区别 4、 如何判断前后端bug/3xx是什么意思 5、 说一下XXX项目中你做的接口测试/做了多少次 6、 http和https的区别 7、 考了几个ADB命令/查看…...

基于.NetCore开源的Windows的GIF录屏工具
推荐一个Github上Start超过20K的超火、好用的屏幕截图转换为 GIF 动图开源项目。 项目简介 这是基于.Net Core WPF 开发的、开源项目,可将屏幕截图转为 GIF 动画。它的核心功能是能够简单、快速地截取整个屏幕或者选定区域,并将其转为 GIF动画&#x…...

PCB 基础~典型的PCB设计流程,典型的PCB制造流程
典型的PCB设计流程 典型的PCB制造流程 • 从客户手中拿到Gerber, Drill以及其它PCB相关文件 • 准备PCB基片和薄片 – 铜箔的底片会被粘合在基材上 • 内层图像蚀刻 – 抗腐蚀的化学药水会涂在需要保留的铜箔上(例如走线和过孔) – 其他药水…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...

ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...