学习交流加

  • 个人qq:
    1126137994
  • 个人微信:
    liu1126137994
  • 学习交流资源分享qq群:
    962535112

上一篇文章我们学习了微处理器与微控制器的区别。点击链接查看上一篇文章的内容:微处理器与微控制器

本篇文章我们学习中断的概念与意义。本片文章只学习中断概念与意义,并不深入研究中断向量表与ISR中断服务程序的实现。同时本片文章讲解一个与中断有关的应用:断点调试。当然具体的断点调试方法会在后面讲解,本次只是说明中断在断点调试中的应用。

文章目录

  • 1、中断的概念与意义
    • 1.2、 中断的概念
    • 1.2、中断的意义
    • 1.3、中断的类型
    • 1.4、中断的优先级
  • 2、中断的应用-断点调试
    • 2.2、什么是程序的断点?
    • 2.2、 程序断点的实现原理
  • 3、总结

1、中断的概念与意义

1.2、 中断的概念

  • 中断是一种处理器与外设进行通信的机制(在我们学习了信号机制,会发现不一定是与外设之间)
  • 外设通过产生中断,向处理器告知,外部有重要事件发生
  • 处理器收到中断后,需要响应中断(具体如何响应见后面内容)

上面只是中断的简单概念。举个例子,我们点击鼠标的时候,鼠标这个外设会产生一个中断,当CPU收到这个中断的时候,CPU会响应这个中断,进而执行ISR(中断服务程序),在中断服务程序中肯定会调用鼠标的驱动模块,从而在电脑上我们才能看到鼠标的点击效果。

那么什么是中断服务程序呢(ISR)?

  1. 首先中断服务程序会从外设中读取外设的中断寄存器,从而获得中断的类型
  2. 然后根据中断类型,设计具体的处理逻辑(后面的学习中我们会发现实际上是通过中断向量表来选取具体的处理逻辑)
  3. 中断处理完毕后,还需要清除外设中的中断寄存器内容
  4. 然后清除CPU中的中断标识位
  5. 最后还需要恢复CPU中本该执行的指令

下面看一个图示来表示一个中断产生的过程:

  • 步骤一外设产生中断
  • 步骤二要先把当前正在执行的程序的上下文保存(比如通用寄存器的值)
  • 步骤三四读取外设中断寄存器的值,获得中断类型
  • 步骤五执行相应的中断处理程序
  • 步骤六清除外设的中断寄存器的值
  • 步骤七清除CPU的中断标识位
  • 步骤八恢复当前需要执行程序的上下文环境

那么,从程序的角度来考虑,中断服务程序(ISR)有哪些特征呢?

我们知道,中断服务程序执行完之后,需要再次回到之前的程序继续执行,所以ISR不能有返回值(想一想你有返回值得到话,谁来接收这个返回值呢?),并且,没有参数传递!因为前期已经通断中断向量表来选取了特定类型的处理逻辑,此处无需再让中断的类型当做参数传递来决定如何设计处理逻辑,所以无需参数。同时,对于这种打断程序运行的,比如后面的信号,程序最好不要太长,容易产生错误。所以ISR最好短小精悍,为了能够快速结束,最好少做浮点运算。

  • 不能有返回值,不能有参数传递
  • 尽量短小高效,避免浮点运算

1.2、中断的意义

  • 应用程序不必关心中断的处理与发生
  • 中断服务程序也不用关心应用程序的状态
  • 中断是上层应用与底层代码的分界线

1.3、中断的类型

  • 硬中断

    • 通过处理器的中断信号线产生的中断(鼠标按一下产生的中断,通过中断信号线发送给处理器)
  • 软中断

    • 通过非法指令或者特殊指令陷入的中断(比如系统调用也是一种软中断,它就是通过特殊指令Int 0x80陷入内核,也可以看做一种中断。再比如后面会学习的信号,也是一种中断)

1.4、中断的优先级

比如此时有好几个中断信号产生,比如你的电脑正在运行微博程序,你点击鼠标,立马有反应,这说明什么?说明鼠标的优先级比微博程序的优先级高。其实,任何ISR的优先级,都比应用程序的优先级高。而中断中,也分为不同的优先级,高优先级的中断会优先得到CPU的处理,且一个中断ISR在运行时,如果再来一个比它优先级高的中断,这个高优先级的中断会打断那个正在执行的中断程序。

  • 中断优先级

    1. 多个中断同时出现时,处理器优先响应高优先级的中断
    2. 低优先级中断的ISR执行时,可以被高优先级的中断再次打断
    3. ISR比上层应用程序的优先级都高

2、中断的应用-断点调试

2.2、什么是程序的断点?

大家都知道断点调试。程序的断点,其实就是一个指令的地址。这个指令的地址,是调试工具(例如GDB)让代码停止执行时候的位置。当你设置断点后,程序会在你设置的断点处停止执行。然后去执行你的调试工具里面的相应程序,那么接下来你就可以使用调试工具来获取程序的相应信息,比如上下文环境,栈信息等

2.2、 程序断点的实现原理

程序断点的实现原理,依赖于CPU的中断机制。包括CPU的硬中断机制与软中断机制。

说的通俗一点,就是将断点处的指令替换为中断触发指令,不再继续执行当前程序,而是去执行中断服务程序ISR,然后ISR再将CPU控制权交给你的调试工具的处理程序。

  • 程序断点的实现原理

    1. 获取源程序指定行对应的代码地址(指令地址)
    2. 保存当前程序的上下文环境信息
    3. 把该指令地址处的指令,替换为中断触发指令
    4. 在中断服务程序ISR中将CPU控制权交给调试工具的处理程序
    5. 调试程序开始做相应处理(比如可以读取源程序的上下文信息或者栈信息)
    6. 调试程序处理完后,将之前指令地址处的指令还原
    7. 恢复之前程序的上下文信息
    8. 源程序继续从断点处执行程序

下面来看一张图理解断点的实现原理

其中中断触发指令,被CPU执行后,OS会向调试程序发送signal,signal后面会讲。调试程序收到signal,会执行响应的处理函数handle。

以上只是大致讲原理,没有深入研究源码。

3、总结

本篇文章要学会:

  • 中断的概念与意义
  • 中断的类型(硬中断与软中断)
  • 中断的应用-断点与断点的实现原理

本系列文章几乎全部参考狄泰软件学院相关课程,想学习的可以加群,
群聊号码:199546072

学习探讨加个人:
qq:1126137994
微信:liu1126137994

【软件开发底层知识修炼】二 深入浅出处理器之二 中断的概念与意义相关推荐

  1. 【软件开发底层知识修炼】二十八 C/C++中volatile的作用

    上一篇文章学习了C/C++中的指针与数组的区别,点击链接进行查看:[软件开发底层知识修炼]二十七 C/C++中的指针与数组是不同的 本篇文章将学习volatile关键字在C/C++中的作用 文章目录 ...

  2. 【软件开发底层知识修炼】二十七 C/C++中的指针与数组是不同的

    上几篇文章学习了ABI-应用程序二进制接口:[软件开发底层知识修炼]二十六 ABI-应用程序二进制接口 学习总结文章目录 本篇文章就指针与数组的联系与区别来学习学习 文章目录 1 疑问 2 指针与数组 ...

  3. 【软件开发底层知识修炼】二十六 ABI-应用程序二进制接口 学习总结文章目录

    前面学习了ABI的知识,感觉受益良多.对底层与编译器有更加深刻的认识,为此这里将前面写过的关于ABI 的文章给列出来,方便学习与翻阅. [软件开发底层知识修炼]二十一 ABI-应用程序二进制接口一 [ ...

  4. 【软件开发底层知识修炼】二十五 ABI之函数调用约定二之函数返回值为结构体时的约定

    上一篇文章学习了几种函数调用约定的区别,点击链接查看上一篇文章:[软件开发底层知识修炼]二十四 ABI之函数调用约定 本篇文章继续学习函数调用约定中,关于函数返回值的问题.当函数返回值为结构体时,函数 ...

  5. 【软件开发底层知识修炼】二十四 ABI之函数调用约定

    上一篇文章学习了Linux环境下的函数栈帧的形成与摧毁.点击链接查看相关文章:软件开发底层知识修炼]二十三 ABI-应用程序二进制接口三之深入理解函数栈帧的形成与摧毁 本篇文章继续学习ABI接口相关的 ...

  6. 【软件开发底层知识修炼】二十三 ABI-应用程序二进制接口三之深入理解函数栈帧的形成与摧毁

    上两篇文章我们初步接触了ABI-应用程序二进制接口的概念,点击链接查看上一篇文章:[软件开发底层知识修炼]二十二 ABI-应用程序二进制接口 二.了解了为什么会有ABI的存在.本篇文章继续学习ABI ...

  7. 【软件开发底层知识修炼】二十二 ABI-应用程序二进制接口 二

    上一篇文章学习了ABI的相关内容,具体最后分析了不同ABI下结构体的对齐方式的不同.点击链接查看上一篇文章:[软件开发底层知识修炼]二十一 ABI-应用程序二进制接口一 本篇文章继续学习ABI相关内容 ...

  8. 【软件开发底层知识修炼】二十 深入理解可执行程序的结构

    上一篇文章记录了GDB调试从入门到熟练掌握的学习全过程.点击链接查看:[软件开发底层知识修炼]十九 GDB调试从入门到熟练掌握超级详细实战教程学习目录 还记得在以前的学习Binutils工具的时候,学 ...

  9. 【软件开发底层知识修炼】十五 快速学习GDB调试二 使用GDB进行断点调试

    上一篇文章我们学习了使用GDB的最基本方法:[软件开发底层知识修炼]十四 快速学习GDB调试一 入门使用 本篇文章将学习GDB的断点调试.断点调试是一种非常重要的调试方法. 文章目录 1 断点类型 2 ...

  10. 【软件开发底层知识修炼】十九 GDB调试从入门到熟练掌握超级详细实战教程学习目录

    本文记录之前写过的5篇关于GDB快速学习的文章,从第一篇开始学习到最后一篇,保证可以从入门GDB调试到熟练掌握GDB调试的技巧. 学习交流加 个人qq: 1126137994 个人微信: liu112 ...

最新文章

  1. fprintf()中的stderr解析
  2. 人脸静默活体检测最新综述
  3. 后台获取前台runat=server的select的值
  4. 自动校验控件演示[含源码]
  5. R-CNN detection 运行问题及办法
  6. Dev控件使用CheckedListBoxControl获取items.count为0 的解决方法
  7. 浅析 Linux 初始化 init 系统,第 1 部分: sysvinit
  8. oracle简单对象类型
  9. 一次kvm嵌套虚拟化踩坑经历
  10. Linux基本命令总结(六)
  11. Python标准库--time模块的详解
  12. acdream 1735 输油管道 贪心
  13. 办公自动化:PDF文件合并器,将多个PDF文件进行合并...
  14. html文字段落i排版,i排版怎么修改字体 字体排版详细介绍
  15. 家庭收支记账软件项目【Golang-面向对象】
  16. 以休闲游戏“植物大战僵尸”为例,制作无限阳光修改器。
  17. 【ETH链游】阿蟹Axie Infinity模拟器运行及多开
  18. Hazelcast IMDG参考中文版手册-第四章-配置
  19. PhaserTape:把智能手机变成测距仪
  20. python main.py是什么意思_什么是__main__.py?

热门文章

  1. 玩转oracle 11g(51):select t.*,t.rowid
  2. 实例8:python
  3. python给矩阵赋值_解决Python二维数组赋值问题
  4. 计算机的特点 分类及其应用,2016计算机知识:计算机的特点、分类及其应用(1)...
  5. JZOJ5776. 【NOIP2008模拟】小x游世界树
  6. 【翻译】Pro.Silverlight.5.in.CSharp.4th.Edition - 第三章 布局 03
  7. Java 面试题(4)—— 多线程
  8. Unable to locate the default servlet for serving static content. Please set the 'defaultServletName'
  9. npm install引起的项目崩溃(This is probably not a problem with npm,there is likely additional logging outp)
  10. 发布-订阅消息常用通信方式