(凭什么断点要放入堆栈?)微机学习:第八课
兄弟们,姐妹们,又是一篇还账的文章
疫情管控越来越严了,大家去做核酸了,我们因此只上了一节课,整节课讲的内容都是中断
有一个内容让我引起一点思考,那就是堆栈的数据结构在中断中的应用,老师不会讲的那么深,但是身为一个acmer,经常用得到堆栈的人,当然要做多一点的思考(阐释放在了下面目录的“可屏蔽中断INTR的响应过程”)
中断的分类
- 硬件中断
- 定义
- 分类
- 可屏蔽中断
- 不可屏蔽中断
- 硬件中断的响应过程
- 可屏蔽中断INTR的响应过程
- 非屏蔽中断NMI的响应过程
- 软件中断
- 定义
- 特点
硬件中断
定义
由外部硬件产生的中断,也称为外部中断
分类
可屏蔽中断
可屏蔽中断INTR是由外部设备通过一片8259A产生的中断请求。
不可屏蔽中断
不可屏蔽中断NMI,来源于三方:
①系统板的RAM在读写时产生奇偶校验错误
②I/O通道中的扩展选件出现奇偶校验错误
③协处理器的异常状态昌盛的中断
硬件中断的响应过程
①从NMI引脚进入的中断为非屏蔽中断,不受标志IF的影响,一般用来处理系统的重大故障
②从INTR引脚进入的中断一般为外部设备发出的中断为可屏蔽中断。当CPU收到该中断请求且IF标志位1,则会在执行完当前指令后响应这一请求。
可屏蔽中断INTR的响应过程
①从数据总线上读取中断类型码,存入内部暂存器
②将标志寄存器的值推入堆栈,判断IF值
③把标志寄存器的中断允许标志IF和跟踪标志TF清零
④将断点保存在堆栈中
⑤找到中断向量,转入相应的中断处理子程序
我认为,大家看到堆栈应该引起思考,为什么是堆栈?既然是找个地方存标志寄存器和断点,为什么别的数据结构不行?
中断是有可能实现嵌套的,假如任务A正在执行,突然来了个中断B,这是个可屏蔽中断,我们就需要此时此刻把标志寄存器放入堆栈,看IF是否为1。这里我们还暂时不能看到堆栈的神奇之处,接着往下看。
IF=1,那么这个中断是可以执行的了,我们就把标志寄存器清零(很显然要清零,总不能来个中断都允许吧?)。执行这个中断,把任务A“暂停”,任务B开始进行。但是任务A是暂停,而不是不做了,所以把任务A已经做完的任务放到堆栈里面,以便后面取(可以思考一下用堆栈的必要性了),这就是断点。
那么假如遇上了如上面的过程,过程B也被中断了,断点放到堆栈,去执行任务C了,假设任务C不再遇到中断,任务C完成后,要开始取之前的断点了,被暂停的任务终究是会被完成的,而前面的A被中断后被B取而代之,显然要在B的任务完成后才会继续做A,即B的优先级高于A。那么我们就要继续任务B了,所以取出任务B。
发现了吗?任务B是后进去的,却是先出来的。
这是最简单的情况,只用了三个任务ABC,推广就可以自己证明了,一定能印证我的观点的。
因此,我们需要的是后进先出的数据结构,而不是像队列那种先进先出的数据结构,也不会是链表,因为已经知道中断的这种嵌套关系造成的任务之间的优先级关系,堆栈是在合适不过的数据结构了。
非屏蔽中断NMI的响应过程
其实只有两点不同:不需要判断IF,也不需要读取中断号
软件中断
定义
CPU根据软件中的某条指令或者软件对标志寄存器中某个标志的设置而产生的中断,其产生的过程与硬件电路无关,又称为内部中断。
特点
不受中断标志位状态的影响
中断码由指令提供
正在执行软件中断时,如果有非屏蔽中断,或者可屏蔽中断的IF为1,则在执行完当前指令后响应
最后再给个经典图来讲中断过程:
(凭什么断点要放入堆栈?)微机学习:第八课相关推荐
- java怎么把随机数放入数组_Java学习:集合的使用与数组的区别
ArrayList 集合 ArrayList 集合 ArrayList list = new ArrayList<>(); 对于ArrayList来说,有一个尖括号代表泛型. 泛型:也就是 ...
- mysql 事务 select_mysql 多个select需要放入一个事务吗?
第一次写博客,还请大家多多支持 今天同事问了个问题:在多个select的时候,用不用放入同一个事务? 首先先看个例子: publicclassJDBCClient { publicstaticvoid ...
- Python数据分析:异常值检验的两种方法 -- Z 分数 上下分位点(放入自写库,一行代码快速实现)
本文已在公众号 " 数据分析与商业实践 " 首发.关注一下~,更多商业数据分析案例源码等你来撩.后台回复 "异常值" ,即可获取本文的案例示范与包含详细注释的源 ...
- jpg图片无损放入PDF的程序,PDF文件格式分析,图像表达方式
wxleasyland@139.com 用打印的方式,一般是将JPG解码后的数据发给打印机,而不是JPG原始数据,所以PDF打印机会重新压缩. 不对JPG图像进行解压,直接将JPG图像传送到虚拟打印机 ...
- 汇编语言中将数据、代码、栈放入不同的段
数据.代码.栈放入不同的段 在学习汇编语言,将数据.代码.栈放入不同的段.参考王爽老师的<汇编语言>第四版,对P133的汇编代码,进行了个人理解标注.仅供参考,存在错误之处,请大家斧正. ...
- 【Qt】QStackedWidget:将多个窗口控件放入堆中,每次只显示一个窗口控件
1.简介 QStackedWidget可以容纳多个窗口控件,每次只显示其中一个.例如:登录页面.各种功能页面等不同时显示的窗口,可以放入QStackedWidget中. 2.demo // 创建三个页 ...
- 将Bean放入Spring容器中的五种方式
欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/weixin_43741092/ article/details/120176466 将bean放 ...
- 顺序表-有序顺序表表示集合-并集(两者比较,小者放入C,未遍历继续放入)
顺序表的存储结构: typedef struct{int data[Maxsize]; //存在顺序表中的元素int length; //存放顺序表的长度}SqList; 分析: 这里有序的顺序表,可 ...
- R语言使用reshape2包的melt函数将dataframe从宽表到长表(Wide- to long-format)、如果没有指定行标识符号,则所有的字段都会放入variable变量中
R语言使用reshape2包的melt函数将dataframe从宽表到长表(Wide- to long-format).如果没有指定行标识符号,则所有的字段都会放入variable变量中 目录
- OC--有这么一个 整数 123456789,如何将这个整数的每一位数,从末位开始依次放入数组中,并遍历 倒序输出字符串...
有这么一个 整数 123456789,如何将这个整数的每一位数,从末位开始依次放入数组中,并遍历 1 NSInteger num=123456789; 2 NSString *str=[[NSStri ...
最新文章
- 图片视角转换 cv2.warpPerspective
- 编程珠玑第四章习题答案
- 学习ASP.NET比较完整的流程
- Wind River Helix系统及物联网解决方案 简化企业IOT部署
- SharePoint的WebService的应用
- 2017中国电商峰会共话“一带一路”网上商机
- 动态添加 ajax,ajax动态的添加内容【原创】
- 四十一、完成scrapy爬取官方网站新房的数据
- 自动点名系统c语言,用C语言编写一个随机点名系统
- Serverless 工作流给人工智能带来了哪些变化?
- Python爬虫连载16-OCR工具Tesseract、Scrapt初步
- 英特尔大手笔花钱寻觅未来 但新领域变数太多难以成为支柱
- ojective-C学习笔记(7)Foundation框架
- 辩证的看DIV+CSS与TABLE
- IRS2110S+IGBT半桥驱动调试问题记录
- 泪目!这篇博士论文致谢走红:感谢博一与我结婚的妻子...
- python追加_python追加写
- IT行业是吃青春饭的吗?
- Kamiya艾美捷抗胸腺嘧啶二聚体单抗(环丁烷嘧啶二聚体CPD)说明书
- 点阵、基元和晶体结构之间的关系
热门文章
- Spring Boot干货系列:(十二)Spring Boot使用单元测试
- 《音乐达人秀:Adobe Audition实战200例》——实例5 将电视音乐节目伴音转录到电脑里...
- Ubuntu 16.04 LTS 下Nginx的编译安装与启动
- 我的Android 4 学习系列之使用 Internet 资源
- 说说IUnitOfWork~DbContext对象的创建应该向BLL层公开
- MediaWiki自动登陆和更新页面
- u8 和 char如何转化_算法:如何实现大正整数相加?
- 捕捉异常_Python通过try....except...else捕捉和处理异常
- 一段看不懂的乱码字符_字符乱码的解读
- 计算机专业学不学ps,慎重!不建议你报的院校专业,是因为真的考不上!