操作系统学习(三) 中断概述



中断分为外部硬件中断、内部中断和软中断。

 

  1. 中断也是操作系统的一种解决方案,那么为什么需要引入中断机制呢。

    为了分享计算能力,处理器应当为多用户多任务提供硬件一级的支持。在单处理系统中,当一个任务的执行时,还有其他多个任务等待获取处理器来执行。当一个任务等待输入输出时,应该把处理器转给另一个任务执行。但问题是,正在执行的程序进入等待输入输出时他并不知道还有其他任务在等待处理器。这种情况下,即产生一种有效的解决方案,引入中断机制。即中断让正在执行的任务主动放弃处理器给其他任务执行。典型的操作系统每ms或其他周期时间即产生一个时钟中断,来完成线程/进程切换。

     

  2. 外部硬件中断

      外部硬件中断是由处理器以外的设备引起的,分为不可屏蔽中断(NMI)和可屏蔽中断(INTR),这两种中断通过两根引脚和处理相连。NMI一般为严重性中断,譬如电源电量缺失时差生中断。

    在可编程中断控制器8259上, 对IR0--7进行编号,代表中断号。每个IR0-7接上不同的外围设备,IR0表示优先级最高的中断,IR7表示优先级最低的中断。当多个外围设备同时发生中断时,8259根据某种策略优先选择一个中断送给处理器。处理器根据中断号从中断向量表中获取相对应的中断程序。那么,外围设备对应的中断处理程序是如何来的呢,处理器如何知道该怎么处理对应设备的中断呢。原来在BIOS初始化阶段,即初始化外围设备的中断向量表。每个外围设备都有自己的ROM,该存储空间中存放自己设备的初始化代码(包括初始化安装本设备对应的中断处理),这些外围设备的ROM在上电时被映射到内存空间。

    BIOS在初始化时,直接访问内存中的映射内存地址(即访问外围设备的ROM)进行外围设备初始化(本质上,只是初始化所有代码都由外围器件自己提供)。

    当处理器接收到一个中断时,判断flag寄存器中的IF标志位是否为1,为1即响应和处理中断。为0则忽略该中断。Cliclear interrupt flag)关闭flag寄存器中的IF标志位(0),stiset interrupt flag)设置flag寄存器中的IF标志位(1)。当处理器开始处理中断时将当前上下文push入栈,处理中断后iret恢复上下文。当处理器正在处理中断时,8259又产生一个优先级更高的中断,处理器中断当前处理的中断而去处理刚发生的优先级更高的中断,即为中断嵌套。

    在处理器进入处理中断时,调用的是外围设备提供中断处理程序,在该处理程序中还会访问外围设备,譬如获取键盘数据、闹钟中断获取时钟芯片上更新的时间日期等等。


    1. 3.内部中断

        处理器发生内部错误引发的中断,譬如div除法错误、内存访问错误等。和不涉及FLAG寄存器,以及和外围设备总线没有关系,中断号是固定的,随时切入处理。

    2. 4.软中断

        也是由处理器自己产生的,通过int指令。譬如GDB单步跟踪,使用int3指令。另外,譬如系统调用.假如需要读取磁盘中的一个文件,我们可以自己定义中断号和中断处理函数,不用使用int中断,直接使用call/jump指令调用自己写的处理函数,大不了每次加载重定向以下函数地址。但问题是,操作系统提供了这样的一个统一调用函数。我们如果使用call/jump,每次加载并不知道操作系统提供的函数的入口地址在哪里,无法加载后进行重定向函数地址。这种情况下,提出了int软件中断的解决方案。即约定某个中断号即进行系统调用。操作系统在加载完以后,把系统调用函数地址主动写入到系统调用软中断向量表中。这样用户程序无需知道系统调用函数的地址,而是直接int软中断号进入系统调用。

      譬如linux通过int 0x80进入软中断,然后通过系统调用号找system call table中对应的系统高调用。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值