操作系统13:中断处理程序和设备驱动程序

news2024/11/28 6:42:49

目录

1、中断处理程序

(1)中断和陷入

(2)中断处理程序的处理过程

2、设驱动程序

(1)设备驱动程序的功能

(2)设备驱动程序的处理过程

(4)对 I/O 设备的控制方式

4.1 - 轮询的可编程 I/O 方式

4.2 - 中断的可编程 I/O 方式

4.3 - DMA 控制器

4.4 - I/O 通道

3、与设备无关的 I/O 软件

(1)物理设备名、逻辑设备名

(2)与设备无关软件的功能构成

(3)逻辑设备名到物理设备名映射的实现

4、用户层的 I/O 软件

(1)系统调用与库函数

1.1 - 什么是系统调用?

1.2 - 什么是库函数?

(2)假脱机(Spooling)系统

2.1 - 什么是假脱机技术?

2.2 - 假脱机系统的工作原理

2.3 - 假脱机系统的组成

2.4 - 使用守护进程(daemon)


1、中断处理程序

        中断在操作系统中有着特殊重要的地位,它是多道程序得以实现的基础。没有中断,就不可能实现多道程序,因为进程之间的切换是通过中断来完成的。另一方面中断也是设备管理的基础,为了提高处理机的用率和实现 CPU与 I/O 备并行执行,也必需有中断的支持。中断处理程序是 I/O 系统中最低的一层,它是整个 I/O 系统的基础。//中断的重要性

(1)中断和陷入

  • 中断:是指 CPU 对 I/O 设备发来的中断信号的一种响应。CPU 暂停正在执行的程序,保留 CPU 环境后,自动地转去执行该 I/O 设备的中断处理程序。执行完后,再回到断点,继续执行原来的程序。
  • 陷入(trap):由 CPU 内部事件所引起的中断,例如进程在运算中发生了上溢或下溢又如程序出错,如非法指令、地址越界,以及电源故障等。

        中断和陷入的主要区别是信号的来源,即是来自CPU 外部,还是CPU内部。

(2)中断处理程序的处理过程

        当一个进程请求 I/O 操作时,该进程将被挂起,直到 I/O 设备完成 I/O 操作后,设备控制器便向 CPU 发送一个中断请求,CPU 响应后便转向中断处理程序,中断处理程序执行相应的处理,处理完后解除相应进程的阻塞状态。

        中断处理程序的处理过程可分成以下几个步骤:

  1. 测定是否有未响应的中断信号。
  2. 保护被中断进程的CPU环境
  3. 转入相应的设备处理序。
  4. 中断处理。
  5. 恢复CPU的现场并退出中断。

//中断处理前需要保存被中断进程的CPU环境,跟上下文切换的思想一致

        中断的处理流程:

2、设驱动程序

        设备处理程序通常又称为设备驱动程序,它是 I/O系统的高层与设备控制器之间的通信程序,其主要任务是接收上层软件发来的抽象 I/O 要求,如 read 或 write 命令,再把它转换为具体要求后,发送给设备控制器,启动设备去执行;反之,它也将由设备控制器发来的信号传送给上层软件。//驱动程序的用途

        由于驱动程序与硬件密切相关,故通常应为每一类设备配置一种驱动程序。例如,打印机和显示器需要不同的驱动程序。//驱动程序由设备供应商提供,系统提供统一接口,设备供应商去实现,从而在系统层屏蔽复杂性

(1)设备驱动程序的功能

  1. 接收由与设备无关的软件发来的命令和参数,并将命中的抽象要求转换为与设备相关的低层操作序列。
  2. 检查用户 I/O 请求的合法性,了解 I/O 设备的工作状态,传递与 I/O 备操作有关的参数,设置设备的工作方式。
  3. 发出 I/O 命令,如果设备空闲,便立即启动 I/O 设备,完成指定的 I/O 操作;如果设备忙碌,则将请求者的请求块挂在设备队列上等待。
  4. 及时响应由设备控制器发来的中断请求,并根据其中断类型,调用相应的中断处理程序进行处理。

(2)设备驱动程序的处理过程

        设备驱动程序的主要任务是启动指定设备,完成上层指定的 I/O工作。但在启动之前应先完成必要的准备工作,如检测设备状态是否为“忙”等。在完成所有的准备工作后,才向设备控制器发送一条启动命令。

        以下是设备驱动程序的处理过程:

  1. 将抽象要求转换为具体要求。
  2. 对服务请求进行校验。检查该用户的 I/O 请求是不是该设备能够执行的。
  3. 检查设备的状态。检查 I/O 设备否处于接收就绪状态。如果是,启动其设备控制器,否则只能等待。
  4. 传送必要的参数。
  5. 启动 I/O 设备。

        在多道程序系统中,驱动程序一旦发出 I/O 命令,启动了一个 I/O 操作后,驱动程序便把控制返回给 I/O 系统,把自己阻塞起来,直到中断到来时再被唤醒。具体的 I/O 操作是在设备控制器的控制下进行的,因此,在设备忙于传送数据时,处理机又可以去干其它的事情,实现了处理机与 I/O 设备的并行操作//驱动程序 -> 阻塞和唤醒

(4)对 I/O 设备的控制方式

        对设备的控制,早期是使用轮询的可编程 I/O 方式,后来发展为使用中断的可编程 I/O 方式。随着 DMA 控制器的出现,从以字节为单位,改为以数据块为单位进行转输,大大地改善了块设备的 I/O 性能。I/O 通道的出现,又使对 I/O 操作的组织和数据的传送都能独立进行,而无需 CPU 的干预。

        在 I/O 控制方式的整个发展过程中,始终贯穿着这样一条宗旨:即尽量减少主机对 I/O 控制的干预,把主机从繁杂的 I/O 控制事务中解脱出来,以便更多地去完成数据处理任务。

4.1 - 轮询的可编程 I/O 方式

        处理机向控制器发出一条 I/O 指令,需要不断地循环测试 I/O 控制器的状态。//轮询

        缺陷:CPU 的绝大部分时间都处于等待 I/O 设备完成数据 I/O 的循环测试中,造成对 CPU 的极大浪费。// 此方式下CPU中无中断机构

4.2 - 中断的可编程 I/O 方式

        CPU 向 I/O 设备的设备控制器发出一条 I/O 命令,立即返回继续执行原来的任务。设备控制器根据命令的要求去控制指定 I/O 设备。例如输入时,一旦 I/O 数据准备完成,控制器便通过控制线向 CPU 发送中断信号,通知 CPU 获取数据。//CPU和I/O设备并行执行

        该方式下,CPU 和 I/O 设备都处于忙碌状态,提高了整个系统的资源利用率及吞吐量

4.3 - DMA 控制器

        中断驱动 I/O 是以字节为单位进行 I/O 的。每当完成一个字节的 I/O 时,控制器便要向 CPU 请求一次中断。也就是说,为了从磁盘中读出 1KB 的数据块,需要中断 CPU 1K 次。//使用直接存储器访问的原因

        DMA(Direct Memory Access)方式的特点:

  1. 数据传输的基本单位是数据块
  2. 所传送的数据是从设备直接送入内存的,或者相反。
  3. 仅在传送一个或多个数据块的开始和结束时,才需 CPU 干预,整块数据的传送是在控制器的控制下完成的。

4.4 - I/O 通道

        在 DMA 方式下,CPU 每发出一条 I/O 指令,仅能去读写一个连续的数据块。当需要一次去读写多个数据块时,则必须由 CPU 分别发出多条 I/O 指令及进行多次中断处理才能完成。// I/O通道出现的背景

        I/O 通道方式是 DMA 方式的发展,它可进一步减少 CPU 的干预,即把对一个数据块的读(或写)为单位的干预,减少为对一组数据块的读(或写)及有关的控制和管理为单位的干预。同时,又可实现 CPU、通道和 I/O 设备三者的并行操作,从而更有效地提高整个系统的资源利用率。//读写单位由一个数据块转为一组数据块

// 控制方式的发展,总结起来就是:无中断 -> 有中断(字节) -> 数据块 -> 多个数据块

3、与设备无关的 I/O 软件

        为了方便用户和提高 OS 的可适应性与可扩展性,在现代 OS 的 I/O 系统中,都无一例外地增加了与设备无关的 I/O 软件,以实现设备独立性,也称为设备无关性。//想想注册中心

        其基本含义是:应用程序中所用的设备,不局限于使用某个具体的物理设备。为每个设备所配置的设备驱动程序是与硬件紧密相关的软件。为了实现设备独立性,必须再在设备驱动程序之上设置一层软件,称为与设备无关的 I/O 软件,或设备独立性软件。

(1)物理设备名、逻辑设备名

        使用设备的物理名称,会使应用程序与系统中的物理设备直接相关。系统只能根据设备的物理名来分配,无法使用另外的相同设备(不同的物理设备名),如果物理设备被更改,那么与旧设备名称直接相关的应用程序将再也无法运行,所以该方式非常不灵活。//与绑定固定IP地址的通信类似

        逻辑设备名:逻辑设备是抽象的设备名,不指定具体某一台设备。使用逻辑设备名还可实现 I/O 重定向。所谓 I/O 重定向,是指用于 I/O 操作的设备可以更换(即重定向),而不必改变应用程序// I/O重定向的数据结构:逻辑设备表

        逻辑设备名称和物理设备名称的概念,与存储器管理中的逻辑地址和物理地址的概念非常类似,在程序执行时,必须先将逻辑地址转换为物理地址。类似地,为实现从逻辑设备名称到物理设备名称的转换,在系统中需要配置一张逻辑设备表

(2)与设备无关软件的功能构成

  1. 设备驱动程序的统一接口:抽象和具体实现进行分离。//多态
  2. 缓冲管理:缓和 CPU 和 I/O 设备之间的矛盾、提高 CPU 的利用率。
  3. 差错控制:网络重传、磁盘重传、坏块记录等
  4. 设备的分配与回收:为了避免进程对独占设备的争夺,独占设备必须由系统统一分配,进程使用设备时,必须先提出申请。
  5. 独立于设备的逻辑数据块:用来屏蔽不同设备的数据交换单位、读取和传输速率的差异。

(3)逻辑设备名到物理设备名映射的实现

        为了实现与设备的无关性,当应用程序请求使用 I/O 设备时,应当用逻辑设备名。但系统只识别物理设备名,因此在系统中需要配置一张逻辑设备表,用于将逻辑设备名映射为物理设备名//思路:逻辑 -> 物理,都需要一个转换过程,通常都使用中间表来实现

        逻辑设备表 LUT(Logical Unit Table)

        逻辑设备表种包含如下三项:逻辑设备名物理设备名设备驱动程序的入口地址

        当进程用逻辑设备名请求分配 I/O 设备时,系统为它分配一台相应的物理设备。与此同时,在逻辑设备表上建立一个表目,填上应用程序中使用的逻辑设备名和系统分配的物理设备名,以及该设备驱动程序的入口地址。//在第一次使用时建立

        当其他进程再利用该逻辑设备名请求 I/O 操作时,系统通过查找 LUT,便可找到该逻辑设备所对应的物理设备和该设备的驱动程序。//复用之前的信息

4、用户层的 I/O 软件

        一般而言,大部分的 I/O 软件都放在操作系统内部,但仍有一小部分在用户层,其中包括与用户程序链接在一起的库函数,以及完全运行于内核之外的假脱机系统等。

(1)系统调用与库函数

1.1 - 什么是系统调用?

        系统为保护设备的安全性,不允许运行在用户态的进程直接调用运行在核心态的 OS 过程,而是在用户层中引入了一个中介过程一一系统调用应用程序可以通过它间接的调用 OS 中的 I/O 过程,对 I/O 设备进行操作

        事实上,由 OS 向用户提供的所有功能,用户进程都必须通过系统调用来获取。系统调用是应用程序取得 OS 所有服务的唯一途径

1.2 - 什么是库函数?

        内核和库函数之间的关系:内核提供了 OS 的基本能,而库函数扩展了 OS 内核,使用户能方便取得操作系统的服务。// 库函数是开放给用户使用的 API,通过 API 可以直接访问 OS 内核

        在许多现代 OS 中,系统调用本身已经采用 C 语言编写,并以函数形式提供,所以在使用 C 语言编写的用户程序中,可以直接使用这些系统调用。//早期都使用汇编语言

(2)假脱机(Spooling)系统

        通过多道程序技术可将一台物理 CPU 虚拟为多台逻辑 CPU,从而允许多个用户共享一台主机。//虚拟技术

        通过假脱机技术,则可将一台物理 I/O 设备虚拟为多台逻辑 I/O 设备,这样也就允许多个用户共享一台物理 I/O 设备。//假脱机技术,一台物理机映射多台逻辑机

2.1 - 什么是假脱机技术?

        当系统中引入了多道程序技术后,利用其中一道程序,模拟脱机输入时的外围控制机功能,把低速 I/O 设备上的数据传送到高速磁盘上。再用另一道程序模拟脱机输出时外围控制机的功能,把数据从磁盘传送到低速输出设备上。这样,便可在主机的直接控制下,实现以前的脱机输入、输出功能。//同时启动多个进程对 I/O 设备进行操作

        此时的外围操作与 CPU 对数据的处理同时进行,我们把这种技术称为假脱机技术。SPOOLing(Simultaneaus PeriphernalOperating OnLine)

2.2 - 假脱机系统的工作原理

        假脱机技术是对脱机输入/输出系统的模拟,它建立在通道技术和多道程序技术的基础上

2.3 - 假脱机系统的组成

        输入井和输出井。这是在磁盘上开辟出来的两个存储区域。输入井模拟脱机输入时的磁盘,用于收容 I/O 设备输入的数据。输出井模拟脱机输出时的磁盘,用于收容用户程序的输出数据。输入/输出井中的数据一般以文件的形式组织管理,我们把这些文件称为井文件。一个文件仅存放一个进程的输入或输出数据,所有进程的数据输入或输出文件链接成为一个输入或输出队列

        输入缓冲区和输出缓冲区。这是在内存中开辟的两个缓冲区,用于缓和 CPU 和磁盘之间速度不匹配的矛盾。输入缓冲区用于暂存由输入设备传送的数据,之后再传送到输入井。输出缓冲区用于暂存从输出井传送的数据,之后再传送到输出设备。

        输入进程和输出进程。输入进程用于模拟脱机输入时的外围控制机,将用户要求的数据从输入设备传送到输入缓冲区,再存放到输入井。当 CPU 需要输入设备时,直接从输入井读入内存。输出进程用于模拟脱机输出时的外围控制机,把用户要求输入的数据从内存传送并存放到输出井,待输出设备空闲时,再将输出井中的数据经过输出缓冲区输出至输出设备上。

        井管理程序。用于控制作业与磁盘井之间信息的交换。当作业执行过程中向设备发出启动输入或输出操作请求时,由操作系统调用井管理程序,由其控制从输入井读取信息或将信息输出至输出井。

2.4 - 使用守护进程(daemon)

        思想:事实上,凡是需要将独占设备改造为可供多个进程共享的设备时,都要为该设备配置一个守护进程和一个假脱机文件队列(目录)//如打印机守护进程、服务器守护进程、网络守护进程等。

        同样,守护进程是允许使用该独设备的唯一进程,所有其它进程都不能直接使用该设备,只能将对该设备的使用要求写入一份文件中,放在假脱机目录中。由守护进程按照目录中的文件依次来完成诸进程对该设备的请求,这样就把一台独占设备改造为可为多个进程共享的设备。//守护进程的工作原理

// 这种思想就像是执行一个定时程序,又像是两个进程之间通过一个中间邮箱来进行通信

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

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

相关文章

Mac 和 Win,到底用哪个系统学编程?

今天来聊一个老生常谈的问题,学编程时到底选择什么操作系统?Mac、Windows,还是别的什么。。 作为一个每种操作系统都用过很多年的程序员,我会结合我自己的经历来给大家一些参考和建议。 接下来先分别聊聊每种操作系统的优点和不…

React懒加载/动态加载lazy简单实例

两种页面嵌套的方式,一种是父子组件,一种是懒加载 1、父子组件(可略,只用来做例子对比) 原本需要用父子组件来实现页面嵌套,如果嵌套的组件不多,可以这样实现 父页面 import React,{Componen…

Android代码解读之渲染机制揭秘

问题 1.vsync如何协调应用和SurfaceFlinger配合来完成UI渲染、显示,App接收vsync后要做哪些工作? 2.requestLayout和invalidate区别? 3.performTraversals到底是干什么了? 4.surfaceflinger怎么分发vsync信号的? …

【Java】继承背后那些事---深扒继承基本原理|类加载、子类对象创建、方法调用、变量访问

博主简介:努力学习的预备程序媛一枚~博主主页: 是瑶瑶子啦所属专栏: Java岛冒险记【从小白到大佬之路】 学习了继承、多态 本节,将通过一个简单的例子,从概念上介绍原理(实际实现的细节与此有所差别)&#…

HuggingGPT解析:使用 ChatGPT及HuggingFace上的族系解决AI问题

HuggingGPT解析:使用 ChatGPT及HuggingFace上的族系解决AI问题 HuggingGPT是一个利用大型语言模型(LLMs)来解决复杂AI任务的框架。其基本理念是,考虑到LLMs(例如ChatGPT)在语言理解、生成、交互和推理方面展现出了卓越的能力&…

一个优质软件测试工程师简历的范文(答应我一定要收藏起来)

很多刚转行软件测试的小伙伴是不是不知道怎么写好一份优质的软件测试工程师的简历。今天呢,就给大家分享一下一个优质软件测试工程师简历的范文。记得收藏起来哦。 下面的案例:2-3年的软件测试工程的简历 姓 名:XXX 学历:本科 …

源码解析Collections.sort ——从一个逃过单测的 bug 说起

源码解析Collections.sort ——从一个逃过单测的 bug 说起 本文从一个小明写的bug 开始,讲bug的发现、排查定位,并由此展开对涉及的算法进行图解分析和源码分析。 事情挺曲折的,因为小明的代码是有单测的,让小明更加笃定自己写的…

第四节 配置SpringBootAdmin日志管理

本来想用一节就写完SpringBootAdmin的,但随着研究的深入发现一节应该是不够的,网上的资料也不会非常系统,官网的例子有些已经好几年没更新了,所以接下来还是系统性的来写下吧 第一节 完成基础配置,暴露所有端点 第二节…

uniapp App强制更新

需要使用DClound插件市场的一个插件挺好用的!app升级、整包更新和热更新组件 支持vue3 支持打开安卓、苹果应用市场,wgt静默更新https://ext.dcloud.net.cn/plugin?id7286 开始贴代码 // /utils/method.js/*** 获取当前app最新版本* param number ver…

【JAVA】这几个JAVA学习网站你绝不能错过(教学课程篇)

个人主页:【😊许思王】 文章目录 前言HOW2J.CNw3cschool菜鸟教程慕课网开课吧黑马程序员B站 前言 JAVA很难学?学不会怎么办?找对学习网站,让你轻松解决困难。 HOW2J.CN HOW2J.CN是我自认为最好的JAVA学习网站&#x…

df -h 查看Used+Avail != Size

问题描述: 在测试过程中发现,该机器的根目录空间 41G 5.7G ! 50G,即 Used Avail ! Size 问题原因: 经过搜索,了解到这种情况可能是Linux系统默认的文件保留块导致的(Linux系统默认保留5%的容量作为应急…

论文 | 一分钟快速找到自己研究领域的顶刊

1. 打开Web of Science https://www.webofscience.com/wos/alldb/basic-search 2. 点击右上角:产品,再选中:Journal Citation Reports 至于JCR是什么,请看下面的拓展部分 3. 单击顶部的 Categories Categories 是分类、类别的…

LaTeX 速查手册

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

MachineLearningWu_11_NeuralNetworkLayer

x.1 Neural Network layer design 我们接下来来讲解一下深度学习中,神经网络是如何架构的。对于一个具有两层的的神经网络,我们将输入层置为layer0,将第一层隐藏层置为layer1,将 w 2 [ 1 ] w_2^{[1]} w2[1]​标记为第一层中&…

nginx基本使用

这是一份完整的nginx配置文件: #user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024; }http {include mi…

23款奔驰GLS450更换迈巴赫GLS600外观套件,尽显奢华

在外观上不要过分的张扬,低调的同时还要彰显强大的气场,换装迈巴赫专属套件,迈巴赫专属踏板,还有迈巴赫的醒目M标志,车身轮廓和线条方面,奔驰GLS450和迈巴赫GLS600尺寸及其契合,只需通过增加一些…

LayUi基础入门【附有案例从0到1详解】

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于LayUi的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.LayUi的创作背景 二.LayUi是什么 三.…

请收藏!2023年全栈开发人员实战进阶指南终极版

全栈工程师在过去十年中越来越受到欢迎,而且在国内的就业环境下,它是更适合从技术转管理的职位。 但究竟什么是全栈工程师?他需要哪些技术能力?如何才能成为一名优秀的全栈工程师?今天这篇文章就给大家全方位分享一下…

ES6基础语法

目录 解构 数组解构 对象解构 基本数据解构 对象 对象简写 箭头函数 扩展运算符 函数参数解构 对象API拓展 Object.is() Object.assign() Object.getPrototypeOf() Object.setPrototypeOf() Object.keys() Object.values() Object.entries() Object.fromEntries()…

Java --- 云尚优选项目

目录 一、项目工程搭建 二、配置项目相关maven依赖 2.1、cjc.ssyx父工程依赖 2.2、common模块pom依赖 2.3、common-util模块pom依赖 2.4、service-util模块pom依赖 2.5、model模块pom依赖 2.6、service模块pom依赖 三、编写相关工具类 3.1、mybatis-plus分页查询配置…