(8)打造简单OS-中断

一、中断简介

1.1简介

    早期计算机各个程序只能串行执行、系统资源利用低。为了解决上述问题,人们就发明了操作系统,引入了中断机制,实现了多道程序的并发执行,提高了系统资源的利用率。
    中断是多程序并发执行的前提条件。

1.3实模式下的中断向量表

     详情点击

二、中断分类

2.1外部硬件中断

外中断:外中断的信号来源于CPU外部、与当前执行的指令无关。如用户强制结束一个进程、IO设备完成操作发生的中断信号。 

2.1.1可屏蔽中断(INT)

2.1.2非屏蔽中断(NMI)

     NMI发生时,处理器不会从外部获得中断号,它自动生成中断号2,其他处理过程和INT相同。

     

    端口0x70的RTC端口,0X70的最高位(bit 7)是控制NMI中断的开关,当它为0时允许NMI中断到达处理器,为1时则阻断所有的NMI信号,其他7个位(0~6)则实际上用于指定CMOS RAM单元的索引号,CMOS RAM是128字节,正好可以用7位表示

2.2内部中断

     内中断:内中断的信号来源于CPU内部、与当前执行的指令有关。如整数除0。

    和硬件中断不同,内部中断发送在处理器内部,是由执行的指令引起的。

    内部中断不受标志寄存器IF位的影响,也不需要中断识别总线周期,它们的中断类型是固定的,可以立即转入相应的处理过程。

2.3软中断

    软中断是由int指令引起的中断处理。这类中断也不需要中断识别总线周期,中断号在指令中给出,如以下格式:

    int3   :是断点中断指令,调试程序很有用,当程序运行不正常时,希望在某个地方设置一个检查点,这是这条指令目的所在。

    int 0X**  :直接给出中断号,以此来引发0X**号中断

    into  :是溢出中断指令,当处理器执行这条指令时,如果标志OF位是1,那么将产生4号中断,否则什么也不做

三、中断处理过程

    当中断发生时,如果外部硬件到处理器之间的道路畅通的,那么处理器在执行完当前指令后,立即为硬件服务。它首先会响应中断,告诉中断控制器(单处理器时代8259A芯片,现在处理采用更高级的)准备处理该中断了,这时候芯片8259A芯片把中断号送给处理器。

    当处理器知道中断号后,就会做以下几件事情:

(1)保护断点的现场。首先将标志寄存器FLAGS压栈,然后清除它的IF位[0](中断标志,0关闭中断,1开启中断,注意IF位被清除,在中断处理过程中,处理器将不再响应硬件中断,如果希望更高优先级的中断嵌套,可以在编写中断处理程序时,适合用sti指令开放中断)和TF位(陷阱标志),再将当前的代码段寄存器CS和指令指针寄存器IP压栈;

(2)执行中断处理程序。由于处理器这时候已经知道了中断号,它将该中断号乘以4(在实模式下每个中断在中断向量表占4字节),就得到了该中断入口点的中断向量表中的偏移地址和段地址,并分别传送到IP和CS,然后处理器就开始执行中断处理程序了;

(3)返回到断点接着执行。所有中断处理程序的最后一条指令必须是中断返回执行iret。执行iret将导致处理器依此从栈中弹出IP、CS和FLAGS的原始内容。于是转回到原来程序中接着执行。

  重点:处理器设计时,当遇到修改段寄存器SS的指令时,在这条指令和下一条指令执行完毕期间,禁止中断,以此来保护栈,所以我们应该在修改段寄存器SS的指令之后,紧跟着一条修改栈指令SP的指令。

   push cs
   pop  ss      ;//禁止中断
   mov sp, 0  ;// 禁止中断
发布了343 篇原创文章 · 获赞 57 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/jadeshu/article/details/103910323
今日推荐