x86异常处理与中断机制(3)中断处理过程

上一节讲完了根据中断类型号找中断服务程序的过程,现在着重说明一下更加完整的中断处理过程吧。

本节以8086时代的中断处理过程为例进行说明,主要分两大部分

  • 硬件处理
  • 软件处理

需要注意,这不是绝对的,得看实际情况,简单来说就是,如果硬件本来就完成了相关必要动作,中断服务程序就不用再执行了,如果没有,就需要写入程序中执行相关操作。

1 中断处理过程

1.1 前提:产生&检测 中断

在这里插入图片描述
中断处理的前提,是产生中断,然后检测到中断,否则怎么处理呢?

对于中断的产生,分为内部和外部,内部就是指令执行产生的,具体的就不说了,还有来自外部的,一般特别的外设比如电源断电无法屏蔽,其他的外设比如鼠标键盘,通过中断控制器如8259A产生外部中断。

至于中断的检测,内部中断一般是有相关的硬件能够直接检测到并且释放某种信号,外部中断则依赖于一些寄存器标志位之类的,具体看情况。

1.2 中断处理

在这里插入图片描述在这里插入图片描述软硬件的分工不是绝对的,我们需要根据实际情况进行分析,硬件干了的,软件就不用干了,硬件没干的软件就得干。

在这里插入图片描述

硬件处理

在这里插入图片描述

软件处理

在这里插入图片描述

中断的处理过程都是类似的

  • 产生中断,检测到中断
  • 保护现场
  • 找到对应中断服务程序
  • 执行中断处理程序
  • 恢复现场
  • 返回继续执行

另外,中断服务程序本身,也是一段程序,可能在其执行过程中产生中断,也就是中断嵌套,这取决于中断开关,具体细节看实现,不一定。

总而言之,通过一系列的抽象,我们只能获取中断处理的大致过程,实际的过程与实际情况紧密关联,情况多变,需要自己多加使用和练习。

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

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

相关文章

Linux 0.11 内核解析:中断相关(1)asm.s文件中断处理分析

0 源代码 有两个版本的,一个是带中文注释,Intel格式的;一个是不带注释是AT&T格式的。 Linux 0.11 中文注释版 Linux 0.11 源码,基于《Linux内核完全注释》赵炯 1 asm.s 文件 我们先假设该文件处理的中断是无特权过渡的情况…

【精华文】C语言结构体特殊情况分析:结构体指针 / 基本数据类型指针,指向其他结构体

参考链接:Structure pointer pointing to different structure instance 注:可以查看此篇的问题和唯一的回复,那是相对正确的,不要看comment,有很多错误。 我是拒绝分析这种问题的,因为似乎没有人会这么乱用…

enum in c language

今天说说C语言中的枚举。 参考:Enumeration (or enum) in C 1 定义 定义一个枚举类型很容易: enum aa { a1, a2, a3 };这里 enum是关键字aa是枚举变量,也就是我们自定义类型a1,a2,a3是枚举成员 然后怎么使用呢? 首先&#…

信号量SIGCHLD的使用,如何让父进程得知子进程执行结束,如何让父进程区分多个子进程的结束

本教程基于 Ubuntu 20.10 gcc 10.2.0. 示例程序如果不能正常编译和执行,说明您系统和工具版本与我的不匹配,请自行查阅资料。 0 概述 先给出该信号的描述: SignalValueDescriptionSIGCHLD17Child status has changed (POSIX). Signal sent …

使用gdb调试多进程程序、同时调试父进程和子进程

参考: [1] GDB debugging multi-process programs [2] Debugging programs with multiple processes 根据这两篇参考链接,完全可以实现使用gdb同时调试父进程和子进程。 接下来说明一下可能遇到的坑 gdb8.1版本有bug,设置完set detach-fork-on off&…

Linux安装Ncurses库

参考:How To Install Ncurses Library In Linux 针对Ubuntu说明一下: wget https://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.2.tar.gz,至于最新版本,自己看官网,修改一下版本号即可。tar xzf ncurses-6.2.tar.gzcd nc…

gdb 10.2的安装

参考 [1] GDB-10.2 [2] README for GDB release 个人系统 Ubuntu20.10。 注意gdb10.2需要c11语法,需要安装g 下载安装包wget https://ftp.gnu.org/gnu/gdb/gdb-10.2.tar.xz解压缩tar -xvzf gdb-10.2.tar.xz进入解压之后的目录mkdir buildcd build配置,…

gdb tui的使用

[1] GDB Text User Interface [2] GDB Text User Interface 简单来说,进入gdb之后,使用ctrl x 2就足够了。其他细节请参考上述链接,选一个就可以。

C语言中信号函数(signal)的使用

先来简单谈谈C语言中的信号(signal) 首先,signal是C语言库中的函数,它实际上是软中断,也就是软件发出的终端,本质来说,类似于int n。 对于接收到该软中断信号的进程,就会停下手头的…

UNIX哲学

参考: 对比Linux与Windows 使用Linux想要做某些事情的时候,就拆开想,想想我需要哪些功能,需要哪些工具,依次怎么执行,然后用管道建立连接,让数据依次流过不同的工具,从而得到最终结果…

fork创建多个子进程

references: [1] how to create two processes from a single Parent [2] fork() in C [3] linux中fork同时创建多个子进程的方法 fork的本质,就是复制,把当前进程复制一份,然后两个进程并发地执行fork后面的语句,区别就是&#x…

wait系统调用

reference:Wait System Call in C 只强调几点,剩下的直接看参考链接内容就好了,不是偷懒,而是里面内容写的很好了,没必要再写一遍了,这种东西就是单纯的系统调用而已,理解了功能,就完事了&#…

Linux进程间通信:共享内存与管道

references: [1] IPC through shared memory [2] Inter Process Communication (IPC) [3] https://www.geeksforgeeks.org/pipe-system-call/ [4] watch command in Linux with Examples 参考链接1和2是介绍了共享内存IPC的简单原理和相关系统调用的使用参考链接3是介绍了管道通…

find command基本使用

find命令通常用于根据文件名查找文件,这是最基本用法。 find [path] -name/-iname [filename] path写要查找的路径,自动递归查找filename写文件名,可以使用通配符*还有其他什么的表达式 具体细节请man find查阅文档。

正则表达式特别需要注意的点:“空“字符的匹配

在正则表达式中,[...]代表1个字符,不管里面有多少字符,最终这个东西的结果都是1个字符。 对于表达式[^a]表达的匹配除了a之外的字符,并且是1个字符。 需要注意的是,有些特殊字符是不会被匹配的。 我们看一个示例&am…

vim多列操作--插入/删除

插入 How to insert text at beginning of a multi-line selection in vi/VimVim Commands 删除 ctrl v使用上下左右键选中一片区域按d删除

vim进行行内某部分的复制剪切粘贴

ctrl v使用方向键选中你要复制的部分 按d(剪切)或者按y(复制)再移动到你的目标位置,按p粘贴(在正常模式下才行,如果不是,先按esc) 这个过程与你操作word文档的复制粘贴…

函数调用堆栈

基于孟宁老师的Linux内核分析 1 int g(int x){ 2 int y x 3;3 return y;4 }5 6 int f(int x){7 int z x 10;8 return g(z);9 }10 11 int main(){12 int a f(8) 1;13 return 0;14…

gdb调试的几点提示(1)

GDB debugger Examining Memory Continuing and Stepping How to translate a virtual memory address to a physical address? s和n是C语言的下一步 si和ni是汇编语言下一步 gdb能够查看的都是虚拟地址,不能查看物理地址,应用程序都不能查看物理地址…

C语言读取文件

C语言一次性读取文件 C - File I/O C library function - fread() 需要注意的点 fgets函数,一次只能读取一行,并且在结尾自动添加\0fread函数,可以读取很多内容,但是不会添加\0需要手动完成,具体看[参考1]