阅读《Linux内核设计与实现》补充Linux操作系统知识系列(三)之中断处理简介与中断上半部

2021/05/30 Operating_System 共 2123 字,约 7 分钟

本篇将会对中断处理进行入门级的介绍,了解中断的实现,了解中断的上半场

中断的来历

操作系统与硬件交互

  • 众所周知,操作系统的核心功能之一就是对硬件进行管理,操作系统需要对硬件发起的各种请求进行响应,但是CPU核心的响应速度和外围的硬件的响应速度往往不在一个量级之上,我们就需要要选择合适的内核和外围硬件交互的方式
    1. 内核让CPU向外围硬件发起指令:如果是让内核主动向硬件发起请求的话,那么处理器的性能会被极大的浪费,因为处理器的速度比起硬件的速度快太多了,等到底层硬件真的发送请求来的时候处理器没准已经休息很久了
    2. 通过轮询的方式来查询是否有底层硬件的指令需要处理:这种方式可以很明显的感受到处理器将会有极大的浪费时间
    3. 最好的方式就是让处理器自己干自己的事情,直到外围硬件有请求的时候会向内核发起请求,让内核来处理,这就是中断机制

中断简介

中断的本质

  • 中断机制使得硬件可以和内核进行交互,硬件可以通过中断机制来向处理器发送请求
  • 中断的本质其实是一种特殊的电信号,这个电信号由硬件发出传输到中断控制器的引脚中——中断控制器是一个非常简单的电子芯片。当中断处理器接收到一个电信号后就会向处理器发起一个电信号,处理器一旦接收到这个电信号就会中断当前的工作来处理这个中断,此后处理器就会通知操作系统来处理这个中断请求
  • 当硬件产生中断的时候是不会考虑和时钟进行同步的,也就是说中断有可能在任何时候发生
  • 对于不同的设备都会有一个独一无二的中断数字标志,这使得操作系统可以分辨出到底是哪个设备发起的中断

中断与异常

  • 在讨论中断的时候,不得不讨论异常,其实异常和中断的区别真的很小,区别在于异常的产生是需要考虑时钟同步的,因此异常也被称为同步中断
  • 当处理器执行了一个编程产生的错误,或者遇到了罕见的错误,例如分页缺页等需要内核来处理的时候,处理器往往会发起一个异常,处理器对异常的处理和对中断的处理非常相似
  • 硬中断、软中断、异常
    1. 硬中断就是由硬件发起的中断
    2. 软中断有两种,这是由于命名产生的问题,需要根据语境来判断到底是哪一个软中断,一种软中断是软件发起的中断,例如想要读取硬盘中的内容,但是没有权限于是就发起软中断从用户态切换到内核态来完成系统调用;还有一种软中断是中断的下半部,这个软中断是中断下半部的一种实现机制,和BH(bottom half、tasklet并驾齐驱)
    3. 异常就是由于编程出现的错误(除0操作)时需要内核处理时发起的异常(也被称为同步中断)

中断处理程序

设备与中断处理程序

  • 每一个设备都可以发起特定的中断信号,而对于处理器来说,接收到了不同的中断处理信号就会调用这个中断处理信号的特定函数,这个函数被称为中断处理程序
  • 每一个中断处理信号就会对应一个独一无二的中断处理程序,例如,有一个函数专门处理来自时钟的中断、一个函数专门处理来自键盘的中断、一个函数专门处理来自鼠标的中断
  • 中断随时随地有可能产生,所以中断的处理时间需要非常的短,这样才可以保证快速恢复当前的中断代码的执行

中断的上半部与下半部

上半部与下半部概念

  • 人心总是贪婪的,大家都希望中断程序可以运行的快,又可以在中断程序中处理更多的消息,为了实现这两个相互矛盾的需求,一个完整的中断被分为了两个部分,这两个部分被称为上半部分(top half)和下半部分(bottom half)。中断的上半部分就是中断处理程序
  • 中断的上半部在接收到了中断信号之后就会开始执行,在中断的上半部中只会严格执行有限的操作,而那些可以被延迟的操作就会被划分到下半部中去。此后,如果有了合适的时机,那么后半部中的操作就会执行
  • 一般情况而言,中断上半部执行的都是一些急迫并且对时间敏感的内容,其余的内容会被放到中断下半部去执行,就像我们在键盘上面敲上一个字符,那么把这个字符从缓冲区拷贝到内存是急迫且时间敏感的,将这个中断信号记录下来也是时间敏感的,将中断引脚复原同时也是急迫的。在显示器上面显示这个字符是不急迫的;那么拷贝这个字符就应该在中断上半部执行,后面的调用输入法进行联想、显示在屏幕上这些都应该交给中断后半部来完成
  • 对于一个完整中断流程里面什么部位应该放在中断上半部、什么部位应该放在中断下半部,这个是没有统一标准的,这些都只能交给程序员自己去判断,但是仍然有一些经验之谈可以被作为借鉴
    1. 如果一个任务对时间敏感,那么放入中断上半部
    2. 如果一个任务和硬件相关,放到中断上半部
    3. 如果一个任务要保证不能被其他中断打断(至少不能被同等级中断打断)那么把它放到中断上半部
    4. 剩余的就可以考虑放到中断下半部

中断上下文

  • 上下文的概念非常的好理解,当我们运行到一个函数内时,就处于这个函数的上下文之间

  • 中断上下文需要注意的细节是,在中断上下文里面,无法加锁,也无法阻塞,所以每当我们执行中断处理程序的时候都需要尽可能快的完结,因为中断处理程序不单单会抢占其他任务的执行,还会抢占其他中断的处理

    image

中断禁止

  • 这个内容大致了解即可,在中断程序中,很多的中断程序都期望不被打断,这个时候就可以配置,让当前执行的中断处理程序不被其他中断打断
  • 当然,如果设置为不被其他中断打断的话,那么同时也就阻止了内核抢占,这个时候相当于断开了内核和硬件的联系,所以一般都会禁止同等级的中断打扰,并且尽可能快地完成中断处理程序

文档信息

0 comments
Anonymous
Markdown is supported

Be the first person to leave a comment!

Search

    Table of Contents

    文章目录