-
8086中断知识以及编写0号中断处理程序
2020-08-15 00:13:29标志寄存器入栈,置IF=0,TF=0 (为什么要这一步,后面有解释) // 这一步可以模拟为 pushf //标志寄存器入栈 ;下面的步骤完成置IF和TF pushf pop ax and ax,11111100B push ax popf //置IF=0,TF=0 CS和IP入栈 令IP...PART1:前言
int n指令的格式为:int n,n为中断类型码
cpu执行int中断,实际上就相当于引发一个n号中断的中断过程,他的大致执行过程如下:- 取中断类型n
- 标志寄存器入栈,置IF=0,TF=0
(为什么要这一步,后面有解释)
// 这一步可以模拟为 pushf //标志寄存器入栈 ;下面的步骤完成置IF和TF pushf pop ax and ax,11111100B push ax popf //置IF=0,TF=0
- CS和IP入栈
- 令IP=(n*4),CS=(n*4+2)
8086的中断向量表是放在0地址处的,而每一个中断向量由两个字组成,低位字存放IP值,高位字存放CS值,所以上面的赋值就完成了跳转到中断处理程序的功能
为什么中断时要处理
TF
和IF
的值?TF位
:CPU提供的单步中断支持cpu在执行完一次指令后,如果检测到标志寄存器TF=1,则产生单步中断,引发中断过程。
单步中断的中断类型码为1
,也就是说:cpu在执行完一条指令后,如果检测到TF=1,那么就会转去执行1号中断处理程序。
作用:为单步调试程序提供支持,例如debug的t命令IF位
:外中断之可屏蔽中断与不可屏蔽中断IF=1:CPU在执行完一条指令后会检测有无外中断产生,并且响应这个外中断,如键盘鼠标等的输入
IF=0:CPU在执行完一条指令不会响应可屏蔽中断相关指令
sti 设置IF=1
cli 设置IF=0 (close interupt)
PART2:编写并安装0号中断处理程序(除法溢出中断程序)
本来是想写9号中断处理程序的,有一些错误没处理好
1.安装
安装过程就是,先保存原来的中断处理程序的CS和IP,然后通过movsb指令将我们写的程序传送到0000:0200处,然后更改0号中断向量表的地址指向我们安装的程序地址。
s段就是我们自己写的中断处理程序,当发生溢出时会在屏幕上打印一个绿色的a,最后三行是通过retf
指令调用了原来的0号中断处理程序2.执行
-
【Linux中断子系统】中断上下文中为什么不能休眠?
2020-08-03 00:31:494.进入中断处理程序的 handler--->5.关中断(cli指令)---->6.写EOI寄存器(表示中断处理完成)---->7.开中断。 硬中断: 对应于上图的1、2、3步骤,在这几个步骤中,所有中断是被屏蔽的,如果在这个时候...- 操作系统以进程调度为单位,进程的运行在进程的上下文中,进程上下文有丰富的、属于自己的资源:例如有硬件上下文,有用户栈、有内核栈,有用户空间的正文段、数据段等等。
- 中断上下文什么也没有,只有一段执行代码及其附属的数据,而中断执行thread中的临时变量应该保存在栈上,此时中断只能借用当前进程的资源(当前进程提供了内核栈,保存了hardware context,此外各种资源(例如mm_struct)),如果此时在中断上下文中睡眠,它不像进程那样有专属的task struct,因此无从调度,会阻塞系统调度,且无人唤醒。
- 因此Linux kernel的设计者制定了规则:
(1)中断上下文不是调度实体
(2)中断上下文的优先级高于进程上下文
参考文献:
http://www.wowotech.net/process_management/schedule-in-interrupt.html
http://www.wowotech.net/irq_subsystem/workqueue.html
http://bbs.chinaunix.net/thread-2115820-1-1.html -
ARM-相关问题,指令集、异常中断
2020-04-09 11:58:153、为什么程序运行时跳转会影响效率?4、什么情况下才可以发挥cache的作用?5、ARM7和ARM9的差别:6、处理的流水线的级数会影响到CPU的最高频率吗?7、什么是伪指令?8、中断向量表位于存储器什么位置?9、处理软...ARM
1、内存访问各种存储器的速度?
最快的是r0-r15这些寄存器,其后依次是cache、SDRAM、硬盘、网络
2、为什么快速中断比普通中断响应要快?
因为快速中断拥有独立的r8-r12寄存器,这样在模式切换时可以减少寄存器保护的时间,
其次是快速中断处理程序可以位于在异常向量表后面,这样可以减少程序跳转时间。3、为什么程序运行时跳转会影响效率?
程序跳转会影响处理的流水线的顺序执行
4、什么情况下才可以发挥cache的作用?
程序的顺序执行 / 代码重复执行
5、ARM7和ARM9的差别:
- ARM7内核是三级流水线(取指-译码-执行)和提供0.9MIPS/MHz的冯诺伊曼结构;
ARM9内核是五级流水线(取指-译码-执行-访问内存-写寄存器),提供1.1MIPS/MHz的哈佛结构。 - ARM7是没有MMU(内存映射单元),ARM720T是MMU的;
ARM9是有MMU的,ARM940T只有Memory protection unit,不是个完整的MMU。 - ARM7TDMI提供了非常好的性能、功耗比。包含了Thumb指令集快速乘法指令和ICE调试技术的内核。ARM9的时钟频率比ARM7更高,采用哈佛结构区分了数据总线和指令总线。
6、处理的流水线的级数会影响到CPU的最高频率吗?
是的
7、什么是伪指令?
就是不能通过反汇编得到的指令
8、中断向量表位于存储器什么位置?
0x0和0xffff0000两处
9、处理软中断主要用于什么地方?
主要用于操作系统的系统调用
10、ARM处理器对异常中断的响应过程
ARM处理器对异常中断的响应过程如下所述:
1)保存处理器当前状态,中断屏蔽位及各条件标志位;
2)设置当前程序状态寄存器CPSR中的相应位;
3)将lr设置成返回地址;
4)将PC设置成该异常中断的中断向量地址,跳转到相应异常中断处执行。11、ARM指令和Thumb指令的差别
- 在ARM体系结构中,ARM指令集中的指令是32位的指令,其执行效率非常高。对于存储系统数据总线为16位的应用系统,ARM体系提供了Thumb指令集。
- Thumb指令集是对ARM指令集的一个子集重新编码得到的,指令长度为16位。通常在处理器执行ARM程式时,称处理器处于ARM状态;当处理器执行Thumb程式时,称处理器处于Thumb状态。
- Thumb指令集并没有改动ARM体系地层的程式设计模型,只是在该模型上加上了一些限制条件。Thumb指令集中的数据处理指令的操作数仍然为32位,指令寻址地址也是32位的。
12、ARM和Thumb指令集混合使用的场合
通常,Thumb比ARM指令密度高,而且对于内存为8位或16位的系统,使用Thumb效率更高。
不过在下面一些场合下,必须运行在ARM状态,这时就需要混合使用ARM和Thumb。
1)强调速度的场合,应该使用ARM指令集;
2)有些功能只能由ARM指令集完成。如:使能 / 禁止异常中断;
3)当处理器进入异常中断处理程序时,程序状态转换到ARM状态,即在异常中断处理程式入口的一些指令是ARM指令,然后根据需要程序能转换到Thumb状态,在异常中断程式返回前,程序再转换到ARM状态。
4)ARM处理器总是从ARM状态开始执行。因此如果要在调试器中运行Thumb指令集,必须为该Thumb程序添加一个ARM程序头,然后再转换到Thumb状态,执行Thumb程式。13、哈佛结构 对比 冯.诺曼结构 的优势?
哈佛结构与冯.诺曼结构处理器比较,哈佛结构处理器有两个明显的特点:
-
使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存;
-
使用独立的两条总线,分别作为CPU与每个存储器之间的专用通信路径,而这两条总线之间毫无关联
14、为什么在中断向量表中不直接LDR PC,“异常地址”
问:为什么在中断向量表中不直接LDR PC,“异常地址”.而是使用一个标号,然是在后面使用DCD 定义这个标号
答:因为LDR 指令只能跳到当前PC 4kB 范围内,而B 指令能跳转到32MB 范围,
而现在这样在LDR PC, “xxxx”;这条指令不远处用"xxxx"DCD 定义一个字,而这个字里面存放最终异
常服务程序的地址,这样可以实现4GB 全范围跳转.问:LDR 不是可以全空间跳转的吗 《ARM 微控制器基础与实战》程序清单5.3.
答:LDR 伪指令通过设置指令缓冲池才能实现全范围跳转,而LDR 指令则只能实现4KB 范围
跳转. - ARM7内核是三级流水线(取指-译码-执行)和提供0.9MIPS/MHz的冯诺伊曼结构;
-
为什么中断上下文不可以休眠
2013-09-24 22:08:211.进入中断处理程序--->2.保存关键上下文---->3.开中断(sti指令)--->4.进入中断处理程序的handler--->5.关中断(cli指令)---->6.写EOI寄存器(表示中断处理完成)---->7.开中断。 复制代码 硬中断: 对应于上图...不可在中断例程中休眠的原因
如果在某个系统调用中把当前进程休眠,是有明确目标的,这个目标就是过来call这个系统调用的进程(注意这个进程正在running)。
但是中断和进程是异步的,在中断上下文中,当前进程大部分时候和中断代码可能一点关系都没有。要是在这里调用了休眠代码,把当前进程给休眠了,那就极有可能把无关的进程休眠了。再者,如果中断不断到来,会殃及许多无辜的进程。
在中断中休眠某个特定进程是可以实现的,通过内核的task_struct链表可以找到的,不论是根据PID还是name。但是只要这个进程不是当前进程,休眠它也可能没有必要。可能这个进程本来就在休眠;或者正在执行队列中但是还没执行到,如果执行到他了可能又无须休眠了。
还有一个原因是中断也是所谓的原子上下文,有的中断例程中会禁止所有中断,有的中断例程还会使用自旋锁等机制,在其中使用休眠也是非常危险的。 下面会介绍。
--------------------------------------------------------------------------------
1. 中断处理的时候,不应该发生进程切换,因为在中断context中,唯一能打断当前中断handler的只有更高优先级的中断,它不会被进程打断(这点对 于softirq,tasklet也一样,因此这些bottom half也不能休眠),如果在中断context中休眠,则没有办法唤醒它,因为所有的 wake_up_xxx都是针对某个进程而言的,而在中断context中,没有进程的概念,没有一个task_struct(这点对于softirq和 tasklet一样),因此真的休眠了,比如调用了会导致block的例程,内核几乎肯定会死.
2.schedule()在切换进程时,保存当前的进程上下文(CPU寄存器的值、进程的状态以及堆栈中的内容),以便以后恢复此进程运行。中断发生后,内核会先保存当前被中断的进程上下文(在调用中断处理程序后恢复);但在中断处理程序里,CPU寄存器的值肯定已经变化了吧(最重要的程序计数器PC、堆栈SP等),如果此时因为睡眠或阻塞操作调用了schedule(),则保存的进程上下文就不是当前的进程context了.所以不可以在中断处理程序中调用schedule()。
3.2.4内核中schedule()函数本身在进来的时候判断是否处于中断上下文:
if(unlikely(in_interrupt()))
BUG();因此,强行调用schedule()的结果就是内核BUG,但我看2.6.18的内核schedule()的实现却没有这句,改掉了.
4.中断handler会使用被中断的进程内核堆栈,但不会对它有任何影响,因为handler使用完后会完全清除它使用的那部分堆栈,恢复被中断前的原貌.
5.处于中断context时候,内核是不可抢占的,因此,如果休眠,则内核一定挂起.
------------------------------------------------------------------------------------------------------------------------------------
先把中断处理流程给出来
1.进入中断处理程序--->2.保存关键上下文---->3.开中断(sti指令)--->4.进入中断处理程序的handler--->5.关中断(cli指令)---->6.写EOI寄存器(表示中断处理完成)---->7.开中断。
复制代码
硬中断:
对应于上图的1、2、3步骤,在这几个步骤中,所有中断是被屏蔽的,如果在这个时候睡眠了,操作系统不会收到任何中断(包括时钟中断),系统就基本处于瘫痪状态(例如调度器依赖的时钟节拍没有等等……)
软中断:
对应上图的4(当然,准确的说应该是4步骤的后面一点,先把话说保险点,免得思一克又开始较真 )。这个时候不能睡眠的关键是因为上下文。
大家知道操作系统以进程调度为单位,进程的运行在进程的上下文中,以进程描述符作为管理的数据结构。进程可以睡眠的原因是操作系统可以切换不同进程的上下文,进行调度操作,这些操作都以进程描述符为支持。
中断运行在中断上下文,没有一个所谓的中断描述符来描述它,它不是操作系统调度的单位。一旦在中断上下文中睡眠,首先无法切换上下文(因为没有中断描述符,当前上下文的状态得不到保存),其次,没有人来唤醒它,因为它不是操作系统的调度单位。
此外,中断的发生是非常非常频繁的,在一个中断睡眠期间,其它中断发生并睡眠了,那很容易就造成中断栈溢出导致系统崩溃。如果上述条件满足了(也就是有中断描述符,并成为调度器的调度单位,栈也不溢出了,理论上是可以做到中断睡眠的),中断是可以睡眠的,但会引起很多问题.例如,你在时钟中断中睡眠了,那操作系统的时钟就乱了,调度器也了失去依据;例如,你在一个IPI(处理器间中断)中,其它CPU都在死循环等你答复,你确睡眠了,那其它处理器也不工作了;例如,你在一个DMA中断中睡眠了,上面的进程还在同步的等待I/O的完成,性能就大大降低了……还可以举出很多例子。所以,中断是一种紧急事务,需要操作系统立即处理,不是不能做到睡眠,是它没有理由睡眠。
----------------------------------------------------------
通过int 0x80只是实现系统调用的一种方式,而且是最古老的一种方式。应用程序利用int指令进行主动陷入内核,更应该称之为软件中断,这与前面提到的下半部的软中断不是一个概念。应用程序执行系统调用进入到内核后,内核处于进程上下文,是可以阻塞/睡眠的,是中断上下文不能睡眠。-----------------------------------------------------------
这个说起来有点多,一一来看:
1,中断要根据前后文来说,一般说中断上下文中不能睡眠,这个中断是指硬件事件发生,触发CPU停止当前活动转而去处理硬件请求.
2,根据硬件请求响应处理逻辑的实时紧要与否,将整个中断处理过程分为上半部和下半部.
3,上半部也就是所谓的硬中断处理逻辑,其要求cpu在收到硬件请求后必须马上处理的事情,比如网卡收到数据包了,把数据包从网卡缓存拷贝到主存(可以由DMA完成,但寄存器的修改以及资源设定还是要由cpu去做)的逻辑就需要cpu立即去做,不做的话,网络新来的数据包就可能丢失.所以这些紧要操作逻辑为硬中断处理.
4,下半部有很多种机制,其中就包括软中断,还有tasklet,workqueue等,软中断只是其中的一种,由于历史的原因,有时候是混淆称呼下半部和软中断的.
5,软中断处理的逻辑并不那么严格要求及时,比如对网络数据包的处理,因为逻辑复杂,不适合放到硬中断里去做,因为要尽量保证硬中断短小精悍.
6,linux调度是以进程(或者说线程)来的,即做调度是不同进程上下文的切换.
7,而可以看到软中断逻辑不属于任何进程,所以才不能睡眠,因为一旦睡眠,cpu切换出去,就切不回来了(和6一起理解).并不是说无法做到在软/硬中断睡眠,只是目前Linux的实现就是这样的,不允许你这么做,要是这么做了,你就等死.
8,系统调用是属于软中断?难道是指int 0x80?这个不知道是什么概念,但肯定不是与上面的软中断同一个意思.给你两个链接:
http://lenky.info/2013/02/04/32% ... %E8%B0%83%E7%94%A8/
http://lenky.info/2013/02/04/64% ... %E8%B0%83%E7%94%A8/ -
什么是中断,什么是俘获,中断和俘获有什么不同?
2015-07-20 16:41:00中断: 由处理机外部事件引起的... 由处理机内部事件引起的中断称之为俘获,在x86中称为异常,也称同步中断,包括访管中断、程序性中断、机器故障中断。同步中断值得是由CPU控制单元产生,是在一条指令执行之后才... -
详解缺页中断-----缺页中断处理(内核、用户)
2018-08-06 18:21:42进程线性地址空间里的页面不必常驻内存,在执行一条指令时,如果发现他要访问的页没有在内存中(即存在位为0),那么停止该指令的执行,并产生一个页不存在的异常,对应的故障处理程序可通过从外存加载该页的方法来... -
中断延迟是什么?
2014-02-06 17:07:57是指从硬件中断发生到开始执行中断处理程序第一条指令之间的这段时间。 也就是: 计算机接收到中断信号到操作系统作出响应,并完成换到转入中断服务程序的时间。 不严格地,也可以表述为: (外部)硬件(设备)... -
2020-12-18 arm 快速中断和普通中断的区别 &为什么不安全状态不一定死锁 & 父子进程之间变量共享情况& 则...
2020-12-18 08:56:0118只能放一条指令,为了不与1C处的FIQ冲突,这个地方只能跳转,而FIQ不一样,1C以后没有任何中断向量表了,这样可以直接在1C处放FIQ的中断处理程序,由于跳转的范围限制,至少少了一条跳转指令。 ... -
关于ARM中断处理的问题----《ARM嵌入式系统开发-软件设计与优化》第九章中疑问
2014-10-22 20:40:28是这样的,书中讲的是如何处理中断,对于这一节中...注意此时返回地址并没有压栈,只是在R14中,如果在中断处理程序中使用BL指令,那么R14的值将会被覆盖,这样中断返回的地址变为BL指令调用函数的返回地址,这就会导致 -
中断、异常、处理对于操作系统的概念
2020-05-16 22:00:05为什么我们的应用程序不直接去访问我们的外部设备,为什么要通过操作系统去执行 1.操作系统对于计算机来说是被内核信任的第三方软件 2.只有内核可以执行特权指令 3.应用程序实际上是不可信任的 中断、异常和... -
汇编中mov ax,4c00h int 21h和iret指令的区别
2017-05-16 01:40:30学到中断处理程序这一章,突然发现了一个问题。这两个指令都有返回的功能,为什么mov ax,4c00h int 21h只能用在系统自动引发的一些中断的处理程序中,而iret只能用在程序中通过int自己调用的中断例程中呢?它们两个... -
8086cpu的中断
2018-08-03 16:04:191. 为什么需要中断?? 1.1 是为了让cpu具备一种能力,让cpu在执行指令的时候,检测到cpu内部或者外部的一种特殊信号,并且对这种信号做出处理。 1.2 中断是怎么处理的? 中断有中断源,中断向量表,中断... -
中断和异常都是中断!
2020-07-15 21:31:23中断(interrupt)通常被定义为一个事件,它可以让处理器停止当前的工作转而运行中断处理的相关程序。在物理上,中断其实就是CPU芯片内外部硬件电路产生的电信号。 中断通常分为同步中断和异步中断: 同步中断是cpu... -
什么是系统调用?以C语言中的printf()为例,说明Linux系统处理系统调用的详细过程。
2020-09-29 21:27:42②查找中断描述符号表,得到异常的中断处理程序的入口地址。 ③执行system-call()函数,继续保护中断现场信息并检查本次系统调用的正确性。若通过检查,则利用EAX寄存器传递过来的系统调用号查找系统调用入口表,... -
Java程序设计--异常处理
2018-06-17 17:56:20异常时指程序在执行期间发生的事件,是导致程序中断运行的正常指令流。 举一个简单的例子: public class ExceptionDemo01 { public static void main(String[] args) { int x=10; int y=0 ; int m=x/y;//... -
缺页中断
2019-09-23 22:15:16进程线性地址空间里的页面不必常驻内存,在执行一条指令时,如果发现他要访问的页没有在内存中(即存在位为0),那么停止该指令的执行,并产生一个页不存在的异常,对应的故障处理程序可通过从外存加载该页的方法来... -
ARM Cortex-M0+中断机制与中断编程步骤
2019-10-09 20:25:43为什么需要使用中断? 如果通过查询接收标志查看一个字节是否收到,则需要时刻花费CPU等资源。但中断机制能够在收到一个字节后,通知CPU把收到的字节取走。 异常:CPU强行从正常运行的程序切换到由某些内部或外部... -
Linux下线程为什么不是系统调用,而是做成 Pthread库提供实现?
2018-08-23 13:23:03中断分为软中断和硬件中断,软中断在X86的机器上是通过int $0x80指令调用的,通过该指令陷入到内核,根据内核维护的中断向量表找到对应的中断处理程序。 那么为什么线程不做成系统调用呢? 首先在Linux诞生的时候... -
汇编1.1.3本节回顾 imul 这个寄存器 这条指令 ==上面寄存器=上面寄存器*这个寄存器
2020-08-28 00:52:14汇编语言是一个很好的工具,学习它可以了解到应用程序时如何通过中断处理,系统调用和共享内存区域来实现与计算机操作系统的通信。汇编语言编程同样也有助于学习操作系统时如何加载和执行应用程序的。 3.比较高级... -
关于中断(补充中)
2020-09-13 19:53:032.为什么引入中断? 中断在操作系统中有着特殊重要的地位,它是多道程序得以实现的基础,没有中断就没有多道程序。另一方面也是设备管理的基础,为了提高处理机的利用率和实现CPU与I/O设备并行执行,必需有中断的... -
深入理解 Linux 内核---中断和异常
2018-10-23 21:18:07中断或异常会改变处理器执行的指令顺序。 异常: 来源:CPU 控制单元, 时机:只有在一条指令终止...为什么要引入中断信号?因为中断信可使得处理器转而去运行正常控制流之外的代码。 当中断信号到来时,CPU ... -
内存常识之缺页中断
2018-02-03 15:07:04进程线性地址空间里的页面不必常驻内存,在执行一条指令时,如果发现他要访问的页没有在内存中(存在位为0),那么停止该指令的执行,并产生一个页不存在异常,对应的故障处理程序可通过从外存加载加载该页到内存... -
为什么ARM有7种工作模式?
2020-06-11 11:35:20用于通常的中断处理,处理低优先级中断 管理模式(Supervisor)(svc): 操作系统使用的保护模式,复位或者处理软件中断swi reset 数据访问终止模式(Abort mode)(abt): 当数据或指令预取终止时进入该模 -
操作系统的中断、异常和系统调用
2019-03-09 21:42:41在下列事件中,进程可能把...1.为什么需要中断、异常和系统调用 在计算机系统中,内核是被信任的第三方,可以在里面做对计算机系统里的任何内容的控制,而且可以执行它的特权指令。这种信任并不是指内核和外界隔... -
中断、异常和系统调用
2018-07-24 15:23:53为什么需要中断、异常和系统调用? 1 在操作系统中有很多的应用程序需要操作系统提供服务,但是这些应用程序不能完全信任,而操作系统内核是被信任的第三方。只有内核可以执行特权指令,方便为应用程序提供服务。 ... -
Linux性能优化——中断绑定
2018-12-30 21:44:15中断绑定 对于实时环境,我们需要消除或者最小化事件响应的延迟。要想做到这一点,需要将不同的中断响应(IRQs)和用户进程绑定到不同的CPU...这就会延迟中断响应,影响程序的处理时间。为了解决这个问题,可以将... -
(二) 中断、异常和系统调用比较
2017-02-23 01:06:00为什么要中断、异常和系统调用 在计算机运行中,内核被信任的第三方 只有内核可以执行特权指令 方便应用程序 中断和异常希望解决的问题 当外设连接计算机时,会出现什么现象 当...
-
图的遍历
-
Unity ILRuntime框架设计
-
如何发送HTML表单数据
-
MySQL 高可用(DRBD + heartbeat)
-
JMETER 性能测试基础课程
-
MMM 集群部署实现 MySQL 高可用和读写分离
-
AcWing 1047. 糖果
-
Jsplumb从入门到实战
-
LVS + Keepalived 实现 MySQL 负载均衡与高可用
-
Java内存区域
-
Nondestructive identification of ancient Chinese glasses by Raman and proton-induced X-ray emission spectroscopy
-
PPTP_NNN 服务生产环境实战教程
-
SpringBoot原理分析一
-
力扣17. 电话号码的字母组合
-
基于Netty实现一个类SpringMVC的轻量级Java服务端Web开发框架
-
MySQL 高可用工具 heartbeat 实战部署详解
-
电商PC前后端分离项目Spring Boot后台实战第一期
-
揭秘香港房地产,未来中国之我见
-
基于Flink+Hudi构建企业亿级云上实时数据湖教程(PC、移动、小
-
time.h 全部使用举例